空参数的IllegalArgumentException或NullPointerException?

空参数的IllegalArgumentException或NullPointerException?

对于一个属性,我有一个简单的setter方法null不适合此特定属性。在这种情况下,我总是心烦意乱:我应该扔一个IllegalArgumentException,或NullPointerException?从javadocs来看,两者似乎都是合适的。有什么可理解的标准吗?或者这仅仅是你想做的事情中的一件,两者都是正确的吗?



哆啦的时光机
浏览 814回答 3
3回答

冉冉说

好像IllegalArgumentException如果你不想null为允许的值,并且NullPointerException如果你试图使用一个变量null.

牛魔王的故事

你应该用IllegalArgumentException(IAE),而不是NullPointerException(NPE)出于以下原因:首先,NPE JavaDoc显式列出NPE合适的案例。注意,所有这些都会被抛出。由运行时什么时候null使用不当。相反,IAE JavaDoc再清楚不过了:“抛出表示方法已通过非法或不适当的论证。”是的,就是你!其次,当您在堆栈跟踪中看到NPE时,您会假设什么?可能有人取消了null..当您看到IAE时,假设堆栈顶部的方法调用者传递了一个非法值。再一次,后一种假设是正确的,前者具有误导性。第三,由于IAE显然是为验证参数而设计的,所以您必须假设它是默认的异常选择,那么为什么要选择NPE呢?当然不是针对不同的行为-您真的期望调用代码能够单独捕获NPE和IAE,并因此做一些不同的事情吗?您是否试图传递更具体的错误消息?但是,您可以在异常消息文本中这样做,就像对于所有其他不正确的参数一样。第四,所有其他不正确的参数数据都将是IAE,那么为什么不一致呢?为什么这是非法的null它是否如此特殊,与所有其他类型的非法争论相比,它应该有一个单独的例外?最后,我接受其他答案的论点,即JavaAPI的部分以这种方式使用NPE。但是,JavaAPI与从异常类型到命名约定的所有内容都不一致,所以我认为盲目地复制JavaAPI(您最喜欢的部分)并不是一个足够好的论据,不足以胜过这些其他考虑。

红颜莎娜

标准是将NullPointerException..一般正确的“有效Java”在项目42(第一版)、项目60(第二版)或项目72(第三版)“赞成使用标准例外”中对此作了简要讨论:“可以说,所有错误的方法调用都归结为非法参数或非法状态,但其他异常通常用于某些类型的非法参数和状态。如果调用方在某个参数中传递空,而该参数禁止空值,则约定要求抛出NullPointerException,而不是IllegalArgumentException。”
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java