对于null参数,IllegalArgumentException或NullPointerException?

对于一个属性,我有一个简单的setter方法, null不适合这个特定的属性。 我一直在这种情况下被撕毁:我应该抛出一个IllegalArgumentException或一个NullPointerException ? 从javadocs来看,两者似乎都适合。 是否有某种被理解的标准? 或者,这只是其中一件事,你应该做任何你喜欢的事情,而且两者都是正确的?


如果你不想让null成为一个允许的值,那么就会调用IllegalArgumentException ,如果你试图使用一个变量为null的变量,就会抛出NullPointerException


由于以下原因,您应该使用IllegalArgumentException (IAE),而不是NullPointerException (NPE):

首先,NPE JavaDoc明确列出NPE适用的情况。 注意,当null被不恰当地使用时,它们全部被运行时null 。 相比之下,IAE的JavaDoc不能更加清晰:“抛出以表明某种方法已通过非法或不恰当的论证。” 是的,就是你!

其次,当你在堆栈跟踪中看到一个NPE时,你认为什么? 可能有人解引用null 。 当你看到IAE时,你认为堆栈顶部方法的调用者传入了一个非法值。 再一次,后一种假设是真实的,前者是误导性的。

第三,由于IAE是为验证参数设计的,所以你必须假设它是默认的例外选择,那么为什么你会选择NPE呢? 当然,不是因为不同的行为 - 你真的希望调用代码从IAE中分别捕获NPE并做出不同的结果吗? 你是否想要传达更具体的错误信息? 但是,无论如何,您可以在异常消息文本中执行此操作,因为您应该为所有其他不正确的参数进行操作

第四,所有其他不正确的参数数据将是IAE,那么为什么不一致呢? 为什么非法null是如此特殊,以至于它应该与所有其他类型的非法论点单独排除呢?

最后,我接受其他答案给出的观点,即部分Java API以这种方式使用NPE。 但是,Java API与从异常类型到命名约定的所有内容都不一致,所以我认为只是盲目地复制(您最喜欢的部分)Java API并不足以胜过这些其他考虑因素。


标准是抛出NullPointerException。 一般可靠的“Effective Java”在第42条(第1版),第60条(第2版)或第72条(第3版)中简要讨论了“赞成使用标准例外”:

“可以说,所有错误的方法调用归结为非法参数或非法状态,但其他例外标准用于某些类型的非法参数和状态。如果调用方在某些禁止使用空值的参数中传递null,约定规定抛出NullPointerException而不是IllegalArgumentException。“

链接地址: http://www.djcxy.com/p/2129.html

上一篇: IllegalArgumentException or NullPointerException for a null parameter?

下一篇: Why is Java Vector class considered obsolete or deprecated?