C# InvalidParameterException或IllegalArgumentException无效

C# InvalidParameterException或IllegalArgumentException无效,c#,java,exception,C#,Java,Exception,在Java中,何时应该抛出IllegalArgumentException以及何时抛出InvalidParameterException? 来自C#背景的话,我们会有一个ArgumentNullException,它源自ArgumentException。如果我想在Java中实现等效的ArgumentNullException/ParameterNullException,我应该扩展IllegalArgumentException还是InvalidParameterException 注意:我没

在Java中,何时应该抛出
IllegalArgumentException
以及何时抛出
InvalidParameterException
? 来自C#背景的话,我们会有一个
ArgumentNullException
,它源自
ArgumentException
。如果我想在Java中实现等效的
ArgumentNullException
/
ParameterNullException
,我应该扩展
IllegalArgumentException
还是
InvalidParameterException


注意:我没有试图实现
ArgumentNullException
/
ParameterNullException
,如果我能将它们与C#框架相匹配,这只会让我更好地理解这些异常。

显然没有必要对这些异常进行子类化,我会立即使用它们来发出信号,已使用非法参数调用方法。我总是在异常消息部分描述真正的原因


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

首先感谢您的问题。现在我知道存在
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。

当您希望参数不为null时,已经有一个异常可以抛出:NullPointerException。一些程序员认为只有错误的代码才会抛出NullPointerException,但是如果您真的希望参数不为null,并且无法从这种情况中恢复,那么就应该抛出NullPointerException。从JavaDoc:

当应用程序在需要对象的情况下尝试使用null时引发

但如果我们谈论的不是空值,而是无效值,那么您应该抛出IllegalArgumentException。从JavaDoc:

抛出以指示已向方法传递非法或不适当的参数

作为一般建议,我认为您应该熟悉Java异常(来自Java.lang包),并适当地使用它们。如果没有找到合适的异常,则扩展一个


还要注意,异常“InvalidParameterException”在包“java.security”中,这可能不是您想要的。

但是您何时抛出
InvalidParameterException
,而不是
IllegalArgumentException
?@Cornelius,可能永远不会:-)@Cornelius-只有当我必须从Java Crypto Architecture框架实现接口或子类类型并且必须抛出此异常时,我才会使用这个特殊的
InvalidParameterException
(我通常留给专家;-))@Andreas_D我对“非法”这个词感到困惑,它有着令人遗憾的情感负担,我们不想惩罚打电话的人,只想告诉他们他们要求我们做的事情没有意义。命名很难,没有一种计算机语言是完美的等等。很好,我认为
InvalidParameterException
没有命名,名称太笼统了,人们可能不会注意到在正常情况下不应该使用它。在IDE中,不容易注意到类来自不同的包,它们通常是自动导入的。感谢您的回答,
java.lang
清楚地说明了要使用哪一个包:)