【问题标题】:Java: When to use checked exceptions, unchecked exceptions, or assertions [duplicate]Java:何时使用已检查异常、未检查异常或断言 [重复]
【发布时间】:2014-08-04 20:18:07
【问题描述】:

我写的方法如下:

public int count(int x){
 //method contents
}

参数 x 必须介于 0 和 10 之间,尽管使用此代码的任何人都不会遇到问题,因为使用此方法的任何人都不会遇到不满足要求的 x。由于“count”方法被调用的次数,捕获和处理检查的异常可能有点乏味。强制 x 始终介于 0 和 10 之间的最佳方法是什么:已检查异常、未检查异常或断言?

【问题讨论】:

标签: java exception exception-handling assertions


【解决方案1】:
  • 检查异常绝对是不可能的,因为它们只对可能发生的事件有意义无论输入的有效性1;
  • 未经检查的异常作为验证错误是有意义的:例如,抛出IllegalArgumentException 就可以了;
  • Java 断言只能用于断言方法不变量,即那些必须保存输入内容的方法。断言失败应该意味着“有罪的部分”不是调用者,而是方法的代码本身。

1 Josh Bloch,Effective Java,第 41 条:

如果无法通过正确使用 API 来防止异常情况,那么 [已检查异常] 的负担是合理的 使用 API 的程序员一旦遇到异常就可以采取一些有用的措施。除非这两个条件都成立,否则未经检查的异常更合适。

【讨论】:

    【解决方案2】:

    这在一定程度上取决于您的风格,但最常见的方式是未经检查的异常。

    我会编写如下代码:

    public int count(int x){
     if (x < 0 || x > 10) {
         throw new IllegalArgumentException(...);
     }
     //method contents
    }
    

    【讨论】:

    • 反应不佳,请详细说明(例如:在设计权衡、API 暴露、测试中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多