避免使用try-catch语句的充分理由

The*_*eys 6 java exception-handling try-catch

示例#1:

try { fileChooser.setSelectedFile(new File(filename)); }
catch (NullPointerException e) { /* do nothing */ }

示例#2:

if (filename != null)
    fileChooser.setSelectedFile(new File(filename));

出于性能或稳定性(或任何其他原因),#1本质上是不好的,还是只是有点不同?这不是一个很好的例子,因为#1优于#2没有优势,但在不同情况下可能存在(例如,可读性提高,代码行数减少等).


编辑:共识似乎是#1是禁忌.最受欢迎的原因:开销

此外,@ Raph Levien有一个很好的见解:

避免#1的一个原因是它会中毒你使用异常断点的能力.正常运行的代码永远不会故意触发空指针异常.因此,将调试器设置为每次发生时都停止是有意义的.在#1的情况下,您可能会例行地获得此类异常.除其他正当理由外,还有潜在的性能影响.

另外,请参阅链接以获取更多深度.

Vin*_*nie 8

绝对#2是一个更好的选择.不应将异常处理用作程序控制流中的构造.应该使用例外来处理不受程序员控制的情况.在此示例中,您可以检查fileChooser是否为null,以便您可以控制.


Cor*_*old 5

例外会带来一定的开销.如果可以避免它们,在这种情况下,只需检查一个null,那将是首选.

正如其他人所说,使用Exceptions进行流量控制通常也是不好的做法.有关这为什么不好的详细解释,请查看此内容.

以下是该答案的简短介绍:

例外基本上是非本地goto语句,具有后者的所有后果.使用流控制的异常违反了最不惊讶的原则,使程序难以阅读(请记住,程序首先是为程序员编写的).


卢声远*_* Lu 5

  • 不要使用Exception来控制逻辑流程.
  • 永远不要吞下异常.#1违反了它 - 你永远不会知道NPE是来自fileChooser==null还是fileName==null.