NPE和IAE处理方式有何不同?

时间:2014-01-30 14:09:30

标签: java exception nullpointerexception illegalargumentexception

关于holy war question关于在空参数的情况下选择适当的异常,我想知道这个选择是否有任何实际后果。我的意思是,是否存在一个案例,当你抓住NullPointerException而不是IllegalArgumentException,反之亦然,或者抓住两者并以不同的方式处理它们?


说清楚:这绝对不是相关的问题。我不是在问什么异常抛出......我在问他们曾经处理不同的问题。我知道,RuntimeException两者都很难被抓住,但有时候你必须这样做。

3 个答案:

答案 0 :(得分:3)

这两个例外的意图是安静的不同

NPE - 在大多数情况下,我可以想到它是由于编程错误而发生的,所以不应该处理。

如果是nullNPE应该以 fail fast 方式抛出,因为它会影响跟踪。我亲自使用Guava的Preconditions.checkNotNull(E ref, String message)

IAE - 这意味着该类没有预期来自调用者的这样的值。有些情况下,您可以捕获该异常并使用默认值进行恢复。

  

我知道两者都是RuntimeExceptions,他们几乎没有得到   捕获

据我所知,这是一个错误的概念,即运行时异常几乎没有被发现。现在,API更多地依赖于运行时异常,因为他们希望离开调用者来决定是否捕获异常。许多API强制您捕获许多异常,当您知道异常永远不会发生时会导致很多痛苦。您被迫捕获它并留下一个空的catch块或更好的日志,它不应该发生。

然而,API会特意记录何时发生特定异常。

举例Integer.parseInt(String s)抛出NumberFormatException,这是一个运行时异常,在我使用它的大多数情况下,我总是抓住它并使用默认值进行恢复。

想想如果NumberFormatException是一个已检查过的异常,并且你打了一个电话Integer.parseInt("1")的情况,可以清楚地看到它不会发生,但你仍然会被迫抓住它。同意这个例子是一个假设的例子,但我明白了。

根据我的经验,这只是我的意见。

  

我在问他们是否会得到不同的处理方式。

正如我所写,NPE并未在大多数情况下被捕获,但总有例外。就像假设你的系统的一部分保持打开以供其他人编程扩展而且该代码中有NPE并且你不希望上层受其影响然后我捕获NPE并从中删除该组件系统提供适当的日志和痕迹。一个具体的例子是可插拔系统,我不希望我的整个系统因用户编写的插件中的编程错误而崩溃。所以我抓住了Exception。这对其他人来说可能是一个坏榜样,但对我有用。

答案 1 :(得分:1)

根据仅在throw方法中已知的标准清理用户输入时,可以捕获

IllegalArgumentException。这是一个更主观的概念,因此我有时会抓住它。

null你可以随时测试自己。

答案 2 :(得分:0)

从技术角度来看,我认为没有任何区别。我会说坚持一个策略并尽可能地记录它。此外,这些是运行时异常,因此它们并不意味着被捕获,因为它们应该在发生错误或客户端调用方法/服务而不提供所有必需参数时发生。让它崩溃!

关于圣战问题,我确实认为NPE应该只在客户端试图访问一个他们认为不是null但实际上是null且因此不会直接抛出的变量时发生。如果客户端期望非空值并从调用者接收空值,则IAE更合适。这是国际海事组织,不想参与不和。