IllegalArgumentException 或 NullPointerException for a null parameter?[已关闭]
我有一个属性的简单 setter 方法,不适合这个特定的属性。我一直处于这种情况:我应该抛出一个非法的争论异常
,还是一个NullPointerException
?从javadocs来看,两者似乎都很合适。有没有某种可以理解的标准?或者这只是你应该做任何你喜欢的事情之一,两者都是正确的?null
我有一个属性的简单 setter 方法,不适合这个特定的属性。我一直处于这种情况:我应该抛出一个非法的争论异常
,还是一个NullPointerException
?从javadocs来看,两者似乎都很合适。有没有某种可以理解的标准?或者这只是你应该做任何你喜欢的事情之一,两者都是正确的?null
您应该使用 (IAE),而不是 (NPE),原因如下:IllegalArgumentException
NullPointerException
首先,NPE JavaDoc 明确列出了 NPE 适合的情况。请注意,当使用不当时,运行时会引发所有这些操作。相比之下,IAE JavaDoc再清楚不过了:“抛出以表明某个方法已被通过非法或不适当的参数。是的,就是你!null
其次,当您在堆栈跟踪中看到 NPE 时,您会假设什么?可能是有人取消了对 .当您看到 IAE 时,您假定堆栈顶部的方法的调用方传入非法值。同样,后一种假设是正确的,前者具有误导性。null
第三,由于IAE显然是为验证参数而设计的,因此您必须将其假定为异常的默认选择,那么为什么要选择NPE呢?当然不是针对不同的行为 - 你真的期望调用代码能够从IAE中单独捕获NPE并因此做一些不同的事情吗?是否尝试传达更具体的错误消息?但是,无论如何,您可以在异常消息文本中执行此操作,就像对所有其他不正确的参数一样。
第四,所有其他不正确的参数数据都将是IAE,那么为什么不保持一致呢?为什么非法的论点如此特殊,以至于它应该与所有其他类型的非法论点分开一个例外?null
最后,我接受其他答案给出的论点,即Java API的某些部分以这种方式使用NPE。但是,Java API与从异常类型到命名约定的所有内容都不一致,因此我认为只是盲目地复制(您最喜欢的部分)Java API并不是一个足以胜过这些其他考虑因素的论据。
如果您不想成为允许的值,则似乎需要一个,如果您尝试使用事实证明是 .IllegalArgumentException
null
NullPointerException
null