对于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?