是否有一个空指针异常代码气味?

Dre*_*rew 57 java nullpointerexception

最近我的一个同事用一些代码写了一个代码来捕获整个方法的空指针异常,然后返回一个结果.我指出了空指针有多种原因,所以我们将其改为对一个结果进行防御性检查.

但是,捕获NullPointerException似乎对我来说不对.在我看来,Null指针异常是错误代码的结果,而不是系统中的预期异常.

是否有任何情况下捕获空指针异常是有意义的?

Joa*_*uer 36

是的,捕捉任何东西RuntimeException几乎总是代码味道.该C2维基似乎都同意.

一个例外可能是一些特别防御的代码片段,它们运行来自其他模块的大量随机代码.这种防御结构的例子是EDT,ThreadPools/Executors和插件系统.

  • Spring有一个深层的异常层次结构(所有异常都以`RuntimeException`为基础),其中许多都是可以捕获的(例如基于重试的数据访问).仅仅因为你没有*抓住它,并不意味着你*不应该*抓住它. (10认同)
  • @BalusC你想要捕获任何未捕获异常的地方,包括运行时异常,如果你在插件框架中调用代码并且不希望插件代码导致整个应用程序崩溃.通常我会说它适用于要调用的代码被传递的代码(即一个监听器),对吧? (5认同)
  • @Joseph:是的,这是有道理的.但是,在这种情况下你会喜欢捕获`Exception`或者甚至是`Throwable`而不是*具体*`RuntimeException`. (5认同)
  • 你可以安全地离开"几乎". (4认同)

Jef*_*dge 24

我可以想到一个用于永远捕获的用途NullPointerException:

catch (NullPointerException) {
    ApplyPainfulElectricShockToProgrammer();
}
Run Code Online (Sandbox Code Playgroud)


She*_*ari 15

由于第三方库中的错误,我有时必须捕获nullpointer异常.我们使用的库抛出了这个异常,我们无能为力.

在这种情况下,抓住它是可以的,否则不会.

  • @BalusC:我们*应该*拥有世界和平,为所有人提供免费冰淇淋,还有一匹小马...... (59认同)
  • 报告了该bug,并最终修复.但是花了几个月的时间 (5认同)
  • 我觉得这不可接受.该bug应该报告给该库的维护者,他们应该尽快修复和重建.如果他们没有,那么现在是时候寻找另一个了. (3认同)

Osc*_*Ryz 7

这取决于.

这位同事的经验如何?他这样做是为了无知/懒惰还是有一个真正的理由呢?(就像这是主要线程高于一切,永远不应该死?)

捕获运行时异常的90%是错误的,99%捕获NullPointerException是错误的(如果原因是"我得到了很多......" 那么整个程序员都错了,你应该看看照顾他正在做的其余代码)

但在某些情况下,捕获NullPointerException可能是可以接受的.