我有一个简单的属性设置方法,对于这个特定的属性,null
是不合适的。在这种情况下,我一直很犹豫:是抛出 IllegalArgumentException
,还是抛出 NullPointerException
?从 javadocs 中来看,两者似乎都可以。是否有某种明确的标准?或者这只是其中一种情况,你应该按照自己的喜好去做,而且两种做法都是正确的呢?
我有一个简单的属性设置方法,对于这个特定的属性,null
是不合适的。在这种情况下,我一直很犹豫:是抛出 IllegalArgumentException
,还是抛出 NullPointerException
?从 javadocs 中来看,两者似乎都可以。是否有某种明确的标准?或者这只是其中一种情况,你应该按照自己的喜好去做,而且两种做法都是正确的呢?
完全同意所说的内容。早失败、快失败,这是一个非常好的异常口号。
关于抛出哪个异常的问题,大多数时候是个人口味的问题。在我看来,IllegalArgumentException比使用NPE更具体,因为它告诉我问题出在我传递给方法的参数上,而不是在执行方法时可能生成的值上。
以上仅供参考。
抛出一个专门针对null
参数的异常(无论是NullPointerException
还是自定义类型),可以使自动化的null
测试更加可靠。这种自动化测试可以使用反射和一组默认值来完成,例如在Guava的NullPointerTester
中。例如,NullPointerTester
将尝试调用以下方法...
Foo(String string, List<?> list) {
checkArgument(string.length() > 0);
// missing null check for list!
this.string = string;
this.list = list;
}
这段内容涉及到it技术,测试了包含两个参数列表的方法:"", null
和null, ImmutableList.of()
。测试结果应该会抛出预期的NullPointerException
异常。对于此实现,传递一个null
列表并不会产生NullPointerException
异常。然而,它确实会产生IllegalArgumentException
异常,因为NullPointerTester
恰好使用默认字符串""
。如果NullPointerTester
只期望null
值抛出NullPointerException
异常,则可以捕获此错误。如果它期望IllegalArgumentException
异常,则会漏掉此错误。
通常的做法是使用IllegalArgumentException( String message )来声明参数无效,并尽可能提供详细信息...所以如果要说发现了一个空参数而异常非空,您可以这样做:
if( variable == null )
throw new IllegalArgumentException("The object 'variable' cannot be null");
你几乎没有理由隐式使用“NullPointerException”。当你试图在空引用上执行代码(如toString())时,Java虚拟机会抛出NullPointerException异常。
请注意,避免使用空引用可以帮助您避免此类异常。因此,在编写代码时,请始终检查您的变量是否为空。
通常情况下,开发人员绝不应该抛出NullPointerException异常。当代码试图取消引用值为null的变量时,运行时会抛出此异常。因此,如果您的方法想要明确禁止使用null,而不是仅仅因为一个null值导致NullPointerException异常,那么您应该抛出IllegalArgumentException异常。
NullPointerException
。因此,为了给任何使用Kotlin和Java的用户提供一致的行为,您需要使用NullPointerException
。new TreeSet<>().containsAll(Arrays.asList((Object) null));
抛出 NPE
,因为 List
包含 null
。 - Chris Povirk当试图访问一个引用变量当前值为null
的对象时,会抛出NullPointerException
异常。
当方法接收到与其期望格式不同的参数时,会抛出IllegalArgumentException
异常。
IllegalArgumentException
是最合适的选择,因为null
不是您属性的有效值。这个二分法...它们是否互不重叠?只有整体中互不重叠的部分才能构成二分法。我认为:
throw new IllegalArgumentException(new NullPointerException(NULL_ARGUMENT_IN_METHOD_BAD_BOY_BAD));
我希望把空参数从其他非法参数中单独分离出来,所以我从IAE派生了一个异常命名为NullArgumentException。即使不需要阅读异常消息,我也知道一个空参数被传递到一个方法中,并通过读取消息找出哪个参数是空的。我仍然使用IAE处理程序捕获NullArgumentException,但在我的日志中,我可以快速看到区别。