我担心这是一个运行时异常,所以应该尽量少用。
标准用例:
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
一致的政策。它似乎不应该被使用,我们应该坚持我们自己检查的异常。抛出这个问题的好用例是什么?