以编程方式抛出NullPointerException可以吗?

当存在后置条件时,方法的返回值不能为空,可以做些什么?

我可以

assert returnValue != null : "Not acceptable null value";

但断言可能被关闭!

那么可以这样做

if(returnValue==null)
      {
           throw new NullPointerException("return value is null at method AAA");
      }

或者,对于这种情况使用用户定义的异常(如NullReturnValueException)会更好吗?


我认为在JVM为你做这件事之前尽可能早地抛出一个NPE是没问题的 - 特别是对于空参数。 似乎有一些关于此的争论,但Java SE库中有许多例子正是这样做的。 我不明白为什么NPE在你无法自己抛弃的方面应该是神圣的。

但是,我离题了。 这个问题是关于不同的事情。 你在谈论一个后置条件,说明返回值不能为空。 在这种情况下肯定是空的意味着你在这个方法里面有一个bug?

你甚至会如何记录这一点? “如果返回值意外为空,则此方法抛出NullPointerException”? 没有解释这是怎么发生的? 不,我会在这里使用一个断言。 例外情况应该用于可能发生的错误 - 不包括如果方法内部出现问题可能发生的情况,因为这对任何人都没有帮助。


我建议你不要自己抛出NullPointerException

正如ThorbjørnRavn Andersen在下面的评论中所说的,不要这样做的主要原因是您不希望将“真实的,不好的NPE”与故意抛出的NPE混合在一起。

因此,直到您确信自己能够识别“有效”NPE时,如果您想告诉API用户null不是有效的参数值,我建议使用IllegalArgumentException 。 当非法的空参数传递时,你的方法的行为应该被记录下来。

另一个(更现代的imho)选项是在参数附近使用@NotNull注释。 这里是一篇关于使用@NotNull注释的文章。

正如我前面提到的那样,也可能有一些情况,投掷NPE时不会让你或你的队友感到困惑:NPE的原因应该清晰可辨。

例如,如果你使用一些带有预处理模块的库,比如Guava ,那么我发现使用类似checkNotNull()的方法是处理非法传递的空值的一种更好的方法。

checkNotNull(arg, msg)会抛出NPE,但是从堆栈跟踪中可以清楚地看出它是由Preconditions.checkNotNull() ,因此它不是一个未知的错误,而是一种预期的行为。


鉴于NullPointerException是在Java中传达意外的空值的惯用方式,我建议您抛出一个标准的NullPointerException而不是本地的。 另外请记住,最小惊喜的原则会表明,在系统异常类型存在的情况下,您不会发明自己的异常类型。

断言对于调试是很好的,但是如果你必须处理某些条件,这并不是很好,所以这不是一个处理错误条件的好方法。

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

上一篇: Is it okay to throw NullPointerException programmatically?

下一篇: Flexbox: center horizontally and vertically