在Java中,创建、抛出和捕获异常是否会带来性能成本?
我计划将“异常驱动开发”应用于一个大型项目中。我想设计自己的异常并将它们包含在我的方法中,强制开发人员捕获并进行适当的处理。
例如,如果您有一个根据名称从数据库获取用户的方法。
public User getUser(String name);
然而,用户可能为空,很容易忘记在使用用户的公共方法之前检查这一点。
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) {
}
这种设计模式使代码更加安全,可以避免意外崩溃和减少更多的 bug。假设网站每小时有数百名访问者,并且这种设计模式在很多地方都被使用。
这种设计方式会对性能产生什么影响?它的好处是否超过成本,还是只是简单的糟糕编码?
感谢任何帮助!
更新!为了明确起见,我的注意力不是包装 NullPointerException,正如我的示例所暗示的那样。目标是强制实现者编写try/catch,避免由于忘记处理一个:
user == 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;
}