Java:何时使用已检查的异常,未经检查的异常或断言

Java: When to use checked exceptions, unchecked exceptions, or assertions

本问题已经有最佳答案,请猛点这里访问。

我写了以下方法:

1
2
3
public int count(int x){
 //method contents
}

参数x必须介于0和10之间,尽管使用此代码的任何人都不会遇到问题,因为使用此方法的任何人都不会拥有不符合要求的x。 由于调用"计数"方法的次数,捕获和处理已检查的异常可能有点单调乏味。 强制执行x的最佳方法是0到10之间:已检查异常,未经检查的异常或断言?


  • 检查异常肯定是不可能的,因为它们只适用于无论input1的有效性如何都可能发生的事件;
  • 一个未经检查的异常作为验证错误是有道理的:例如,抛出一个IllegalArgumentException将是本书;
  • Java断言应该只用于断言方法不变量,那些必须保存输入的方法。 断言失败应该意味着"有罪的部分"不是调用者,而是方法的代码本身。

1 Josh Bloch,Effective Java,第41项:

The burden [of checked exceptions] is justified if the exceptional condition cannot be prevented by proper use of the API and the programmer using the API can take some useful action once confronted with the exception. Unless both of these conditions hold, an unchecked exception is more appropriate.


这取决于你的风格,但最常见的方式是未经检查的异常。

我会编码这样的代码:

1
2
3
4
5
6
public int count(int x){
 if (x < 0 || x > 10) {
     throw new IllegalArgumentException(...);
 }
 //method contents
}