在 Java 中创建、抛出和捕获异常是否有任何性能成本?
我计划将“异常驱动开发”添加到一个更大的项目中。我想设计自己的异常并将它们包含到我的方法中,迫使开发人员捕获并做适当的工作。
例如,如果您有一种方法可以根据名称从数据库中获取用户。
public User getUser(String name);
但是,用户可能为空并且在使用用户的公共(public)方法之前忘记检查这一点是很常见的。
User user = getUser("adam");
int age = user.getAge();
这将导致 NullPointerException 和崩溃。但是,如果我在返回用户对象之前进行检查,如果它为空并抛出“UserIsNullException”:
public User getUser(String name) throws UserIsNullException;
我强制实现者思考和行动:
try {
User user = getUser("adam");
int age = user.getAge();
}catch( UserIsNullException e) {
}
它使代码在意外崩溃时更安全,并消除了更多错误。假设该网站每小时有数百名访问者,并且这种设计模式几乎无处不在。
这样的设计方法将如何影响性能? yield 是否超过成本,还是仅仅是糟糕的编码?
感谢您的帮助!
更新!需要明确的是,我的注意力并不像我的示例所暗示的那样包装 NullPointerException。 目标是强制实现者编写 try/catch,避免真正崩溃的头痛,因为:
用户 == null
被遗忘了。问题涉及比较这两种设计模型:
int age;
try {
User user = getUser("adam");
age = user.getAge();
}catch( UserIsNullException e) {
age = 0;
}
对比:
int age;
User user = getUser("adam");
if( user != null ) {
age = user.getAge();
} else {
age = 0;
}
最佳答案
抛出异常会降低性能,但这通常是可以接受的,因为异常处理代码仅在异常 情况下执行。如果您开始使用异常来进行流程控制,那么您就是在扭转通常的情况并使它们成为预期的行为。我强烈建议不要这样做。
关于java - 在 Java 中编码 "exception driven development"的性能成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2184935/