关于holy war question关于在空参数的情况下选择正确的异常,我想知道这个选择是否有任何实际后果。我的意思是,有没有一种情况你会遇到 NullPointerException
而不是IllegalArgumentException
,或者反之亦然,或者捕获两者并以不同的方式处理它们?
澄清一下:这绝对不是链接的问题。我不是在问要抛出什么异常...我是在问它们是否曾经得到不同的处理。我知道两者都是 RuntimeException
他们几乎不会被捕获,但有时你必须这么做。
最佳答案
两个异常的意图完全不同
NPE
- 在我能想到的大多数情况下,它是由于编程错误而发生的,因此不应该处理。
如果null
,NPE
应该以快速失败的方式抛出,因为它会影响跟踪。为此,我个人使用 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/