在Java中编码“异常驱动开发”的性能成本?

在 Java 中创建、引发和捕获异常是否会产生任何性能成本?

我正计划将“异常驱动开发”添加到一个更大的项目中。我想设计自己的异常,并将它们包含在我的方法中,迫使开发人员捕获并执行适当的工作。

例如,如果您有一个基于名称从数据库中获取用户的方法。

public User getUser(String name);

但是,用户可能为 null,并且在使用用户的公共方法之前通常会忘记检查这一点。

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) {

}

它使代码在意外崩溃时更加安全,并消除了更多错误。假设该网站每小时有数百名访问者,这种设计模式几乎无处不在。

这种设计方法将如何影响性能?这些好处是否超过了成本,或者只是糟糕的编码?

感谢您的任何帮助!

更新!需要明确的是,我的注意力不是像我的例子所暗示的那样包装NullPointerException。目标是迫使实现者编写一个 try/catch,从而避免真正崩溃的头疼,因为:

用户 == 空

被遗忘了。问题涉及比较这两种设计模型:

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;
}

答案 1

引发异常会降低性能,但这通常是可以接受的,因为异常处理代码仅在特殊情况下执行。如果您开始将异常用于流控制,那么您将扭转通常的情况并使其成为预期的行为。我强烈建议不要这样做。


答案 2

“这将导致NullPointerException和崩溃。

NullPointerException 是一个例外,可以在 catch 中被捕获。

因此,除非它增加了代码的清晰度,否则附加异常是多余的。在这种情况下,它真的没有。实际上,您刚刚采用了一个未经检查的程序员错误异常,并将其提升为已检查的异常。

为程序员的错误创建一个已检查的异常实际上意味着你的代码必须显式处理程序员引入错误的可能性,而他们没有。


推荐