什么时候应该抛出IllegalArgumentException?

我担心这是运行时异常,因此应谨慎使用。

标准用例:

void setPercentage(int pct) {

if( pct < 0 || pct > 100) {

throw new IllegalArgumentException("bad percent");

}

}

但这似乎会强制执行以下设计:

public void computeScore() throws MyPackageException {

try {

setPercentage(userInputPercent);

}

catch(IllegalArgumentException exc){

throw new MyPackageException(exc);

}

}

使它回到被检查的异常。

好的,但是让我们开始吧。如果输入错误,则会出现运行时错误。首先,这实际上是统一实施的相当困难的策略,因为您可能必须执行相反的转换:

public void scanEmail(String emailStr, InputStream mime) {

try {

EmailAddress parsedAddress = EmailUtil.parse(emailStr);

}

catch(ParseException exc){

throw new IllegalArgumentException("bad email", exc);

}

}

更糟的是-虽然0 <= pct && pct <=

100可以预期客户端代码将以静态方式进行检查,但对于更高级的数据(例如电子邮件地址)却并非如此,或更糟糕的是,必须对数据库进行检查,因此,一般而言,客户端代码无法预先执行-

验证。

因此,基本上,我的意思是我看不到使用有意义的一致政策IllegalArgumentException。似乎不应该使用它,我们应该坚持我们自己的检查异常。有什么好的用例来抛出这个?

回答:

将其IllegalArgumentException视为 前提条件 检查,并考虑设计原则:

我同意这个例子是正确的:

void setPercentage(int pct) {

if( pct < 0 || pct > 100) {

throw new IllegalArgumentException("bad percent");

}

}

,这意味着由于某些原因无法将最终条件描述给最终用户,则检查的异常是正确的。第二个版本,为此设计进行了更正:

import com.someoneelse.EmailUtil;

public void scanEmail(String emailStr, InputStream mime) throws ParseException {

EmailAddress parsedAddress = EmailUtil.parseAddress(emailStr);

}

IllegalArgumentException则它可能是所讨论的类所拥有的私有方法,并且仅当前提条件可以在功能文档中描述时才是正确的。这也是一个正确的版本:

/** @param String email An email with an address in the form abc@xyz.com

* with no nested comments, periods or other nonsense.

*/

public String scanEmail(String email)

if (!addressIsProperlyFormatted(email)) {

throw new IllegalArgumentException("invalid address");

}

return parseEmail(emailAddr);

}

private String parseEmail(String emailS) {

// Assumes email is valid

boolean parsesJustFine = true;

// Parse logic

if (!parsesJustFine) {

// As a private method it is an internal error if address is improperly

// formatted. This is an internal error to the class implementation.

throw new AssertError("Internal error");

}

}

  • 如果前提条件的描述成本很高,或者如果该类打算由不知道其电子邮件是否有效的客户使用,则请使用ParseException。这里的顶级方法被命名scanEmail,它暗示最终用户打算通过其发送未研究的电子邮件,因此这可能是正确的。
  • 如果前提条件可以在功能文档中描述,并且该类无意输入无效,并因此指示编程器错误,请使用IllegalArgumentException。尽管未“选中”,但“选中”移至记录该功能的Javadoc,希望客户端遵守该功能。

:这意味着“此对象的内部状态(私有实例变量)无法执行此操作。”

最终用户看不到私有状态,所以松散地说IllegalArgumentException,在客户端调用无法得知对象状态不一致的情况下,它优先于私有状态。尽管它比检查异常更可取,但我没有很好的解释,尽管例如初始化两次或丢失无法恢复的数据库连接之类的例子。

以上是 什么时候应该抛出IllegalArgumentException? 的全部内容, 来源链接: utcz.com/qa/425684.html

回到顶部