gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:37:12 25 4
gpt4 key购买 nike

关于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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com