java - NPE 和 IAE 是否有不同处理方式的情况?

标签 java exception nullpointerexception illegalargumentexception

关于holy war question关于在空参数的情况下选择正确的异常,我想知道这个选择是否有任何实际后果。我的意思是,有没有一种情况你会遇到 NullPointerException而不是IllegalArgumentException ,或者反之亦然,或者捕获两者并以不同的方式处理它们?

<小时/>

澄清一下:这绝对不是链接的问题。我不是在问要抛出什么异常...我是在问它们是否曾经得到不同的处理。我知道两者都是 RuntimeException他们几乎不会被捕获,但有时你必须这么做。

最佳答案

两个异常的意图完全不同

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

如果nullNPE应该以快速失败的方式抛出,因为它会影响跟踪。为此,我个人使用 Guava 的 Preconditions.checkNotNull(E ref, String message)

IAE - 这意味着该类不期望调用者提供这样的值。在某些情况下,您可以捕获该异常并使用默认值进行恢复。

I know that with both being RuntimeExceptions they hardly ever get caught

在我看来,运行时异常几乎不会被捕获,这是一个很大的误解。如今,API 更多地依赖于运行时异常,因为它们希望让调用者来决定是否捕获异常。许多 API 要求您捕获许多异常,当您知道异常永远不会发生时,这会导致很多痛苦。您被迫捕获它并留下一个空的 catch block 或更好的日志以确保它不应该发生。

但是,API 确实会在特定异常发生时明确记录。

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

想象一下这样的场景:如果 NumberFormatException 是一个已检查的异常,并且您调用 Integer.parseInt("1"),则可以清楚地看到它不会发生,但你仍然会被迫捕获它。同意这个例子是一个假设的例子,但它表达了我的观点。

这只是我根据我的经验得出的观点。

I'm asking if they ever get handled differently.

正如我所写,NPE 在大多数情况下都不会被捕获,但总有异常(exception)。就像假设你的系统的一部分保持开放状态以供其他人编程,并且该代码中存在 NPE,并且你不希望上层受到它的影响,那么我捕获 NPE 并从中删除该组件系统提供适当的日志和跟踪。一个具体的例子是可插拔系统,我不希望我的整个系统由于用户编写的插件中的编程错误而崩溃。所以我捕获了异常。这对其他人来说可能是一个坏例子,但对我来说却很有效。

关于java - NPE 和 IAE 是否有不同处理方式的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21458749/

相关文章:

java - onProgressUpdate() 中的 NullPointerException

java - 如何在我的应用程序中查找电池泄漏?

java - Jira 弹出消息

vb.net - 在什么情况下从整数转换为字符串会导致异常?

Python: 'Inline' 一行代码中多个异常源的异常处理

haskell - `Except` 的复杂性在 Haskell 中有何用途?

java - Tabhost 空指针异常

java - java中从文件中读取int

java - JpaRepository 查找左连接无限循环

SimonVT menuDrawer 中出现 java.lang.NullPointerException?