无效参数异常或非法参数异常。

27
在Java中,什么情况下应该抛出IllegalArgumentException,什么情况下应该抛出InvalidParameterException
如果你来自C#背景,那么我们会有一个由ArgumentException派生出来的ArgumentNullException。如果我想在Java中实现一个等价的ArgumentNullException/ParameterNullException,我应该扩展IllegalArgumentException还是InvalidParameterException
注意:我不打算实现ArgumentNullException/ParameterNullException,这只是为了更好地理解,是否能将它们与C#框架匹配。
3个回答

23

没有明显的需要来子类化这些异常,我会直接使用它们来表示方法被非法参数调用的信号。我总是在异常消息部分描述真正的原因。

java.security.InvalidParameterException已经是IllegalArgumentException的一个子类,专门为JCA/JCE引擎类设计(JavaDoc),我不会在不同的上下文中使用或子类化它。


4
什么时候会抛出 InvalidParameterException 而不是 IllegalArgumentException - Cornelius
@Cornelius,可能永远不会 :-) - Péter Török
10
只有当我必须实现来自Java密码体系结构框架的接口或子类类型,并且必须抛出此异常(通常由专家处理)时,才会使用这个特殊的InvalidParameterException。请注意,不要更改原意。 - Andreas Dolk
@Andreas_D 我对“非法”一词感到困惑,因为它带有不幸的情感负荷,我们不想惩罚调用者,只是告诉他们他们要求我们做的事情没有意义。命名是非常困难的,没有一种计算机语言是完美的等等。 - Chris Huang-Leaver

20

首先感谢你的提问。现在我知道了InvalidParameterException的存在。这个异常属于java.security包,并根据它的javadoc说明:

 * This exception, designed for use by the JCA/JCE engine classes, 
 * is thrown when an invalid parameter is passed 
 * to a method.

IllegalArgumentException属于java.lang,因此可以用于任何目的。

我认为在99.9%的情况下,你应该使用IllegalArgumentException,仅在安全上下文中使用InvalidParameterException。


1
很好,我认为InvalidParameterException这个名字起得不太合适,它的名称太过于通用,人们可能不会注意到它在正常情况下不应该被使用。在IDE中,很难注意到类来自不同的包,它们通常是自动导入的。 - Eric
感谢您的回答,java.lang 澄清了应该使用哪一个! :) - aderchox

5
当你期望参数不为空时,已经有一个可以抛出异常的方法:NullPointerException。一些程序员认为只有错误的代码才会抛出NullPointerException,但如果你真的期望参数不为空,并且无法从这种情况中恢复,那么抛出这个异常是正确的选择。来自JavaDoc的说明:
“当应用程序尝试在需要对象的情况下使用null时抛出。”
但是,如果我们不是在讨论空值,而只是一个无效值,那么你应该抛出IllegalArgumentException。来自JavaDoc的说明:
“表示传递给方法的参数是非法或不适当的。”
作为一般建议,我会说你应该熟悉Java异常(来自java.lang包),并适当地使用它们。如果找不到合适的异常,则可以扩展一个异常。
还要注意的是,“InvalidParameterException”异常位于“java.security”包中,这可能不是你想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接