Java,过度使用try / catch会导致性能问题吗?

时间:2016-12-21 21:38:40

标签: java performance optimization

我想到了这样一个事实,即如果有错误,使用try和catch对于防止崩溃非常有用,但如果我过度使用try和catch块,那么如果对性能有任何影响我很好奇。

要恢复:如果我在所有地方使用try和catch(几乎),对性能有任何影响吗?

2 个答案:

答案 0 :(得分:2)

我认为你将看到的主要性能(假设有问题的代码以非常高的频率执行)将来自垃圾收集。

一个简单的例子(你实际上偶尔会在生产代码中看到......)会有密码验证逻辑,如:

if (!password.equals(correctPassword)) {
   throw new IncorrectPasswordException();
}

然后......

catch (final IncorrectPasswordException ex) {
   //some output or so
}

...而不是简单地从不抛出任何东西而只是通过条件处理它。您最终必须从内存中清除所有IncorrectPasswordException

在这种情况下,过度使用异常实际上会变得非常昂贵,因为将简单的评估转换为会耗费内存的对象实例化,更重要的是最终会花费宝贵的CPU周期来通过垃圾回收来回收内存。

答案 1 :(得分:2)

异常投掷/处理会带来轻微的性能损失(确切的数量因具体情况而异),但性能不应该是您的首要考虑因素。

  1. 正确性:首先,确保您的代码能够完成所需的操作。不要将正常用例视为例外情况,例如,如果用户在字段中输入的值不正确,则没有什么特别的,不需要为此抛出异常。但是,如果某些东西真的非常特殊(就像你无法连接到数据库那样),并且你无法在它出现的时候处理它,那就抛出异常。如果异常来自"下面的#34;,来自JDK类或第三方库,除了处理它之外别无选择。
  2. 可读性。不断捕获和重新抛出异常会使您的代码几乎无法跟踪,调试或维护。吞咽异常也是如此。您应该瞄准的是处理异常的一致策略。基本上你应该只处理你可以对它们做些什么的异常。
  3. 效果。这应该是您的最后一个停靠点,一旦您获得前两个排序。你不可能在你的代码正确和可读的地方,并且异常处理仍然是你的应用程序的主要瓶颈,但如果你到那里,你可以尝试返回错误代码而不是丢弃异常,或完全重构代码以避免它们。