java - 在 Java 中编码 "exception driven development"的性能成本?

标签 java performance exception exception-handling overhead

在 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/

相关文章:

java - 通过故障转移使长时间运行的任务仅在集群的一台机器上运行?

c# - String.Where 性能比较差

python - 二进制 1d Numpy 数组到整数的最快一对一映射

ruby-on-rails - 防止 FloatDomainError NaN

java - 如何在 Mac 上使用 Jenkins 运行 selenium 测试用例?

java - 我可以在没有 root 的情况下使用辅助功能 API 在我自己的应用程序之外触发触摸事件吗?

java - 如何将 jarsigner 添加到 PATH

java - 如何在Java类中存储UUID字段?

java - 如何在java中使用TimeUnit

ios - iOS文件读写错误