我担心这是运行时异常,因此应该谨慎使用。
标准用例:
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
的策略。似乎不应该使用它,我们应该坚持使用自己的已检查异常。什么情况下抛出这个异常是一个好的用例?