一尘不染

Java是否为空参数提供IllegalArgumentException或NullPointerException?

java

我有一个简单的属性设置方法,null不适用于此特定属性。在这种情况下,我一直很痛苦:我应该扔IllegalArgumentException还是NullPointerException?从javadocs看来,两者都合适。有某种可以理解的标准吗?还是这只是您应该做的任何事情之一,而且两者都是正确的?


阅读 399

收藏
2020-03-01

共2个答案

一尘不染

IllegalArgumentException如果你不想null成为允许的值,则似乎需要调用;如果你NullPointerException尝试使用原来是的变量,则将抛出null

2020-03-01
一尘不染

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

首先,NPE JavaDoc明确列出了适用NPE的情况。请注意,如果使用不当,它们都会被运行时抛出null。相比之下,IAE JavaDoc并不清楚:“抛出该错误以表明方法已传递了非法或不适当的参数。” 是的,就是你!

其次,当你在堆栈跟踪中看到NPE时,你会怎么做?可能有人取消引用了null。当你看到IAE时,你假定在堆栈顶部传递了非法值的方法的调用者。同样,后一种假设是正确的,前一种是误导性的。

第三,由于IAE显然是为验证参数而设计的,因此你必须将其假定为默认的例外选择,那么为什么要选择NPE?当然不是因为不同的行为-你真的希望调用代码与IAE分开捕获NPE并因此有所作为吗?你是否要传达更具体的错误消息?但是无论如何,你都可以在异常消息文本中执行此操作,就像对所有其他不正确的参数一样。

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

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

2020-03-01