Checked Exception
设计的初衷是为了从异常情况恢复,Checked Exception
假使我们捕获了异常,然后需要恢复程序
Unchecked Exception
运行时异常,类似 NullPointerException
、ArrayIndexOutOfBoundsException
,通常是编码可以避免的逻辑错误,不可恢复
Checked Exception VS Unchecked Exception
支持 Checked Exception
- 编译器强制检查,
Checked Exception
必须被捕获或者传播,这样就不会忘记处理异常。 - 强制的约束鼓励了严格的编码和精确的思考。
支持 Unchecked Exception
Checked & UnChecked Exception
是等价的。无论抛出什么异常,能恢复的都可以去恢复,不能恢复的都恢复不了。- 大多数异常不能被修复。我们看不到异常代码的实现,不对它负责,也无法修复它。
- 沿调用栈向上传播的
Checked Exception
破坏了顶层的方法,因为这些方法必须声明所有它们调用的方法抛出的异常。 - 强制处理或传播
Checked Exception
导致异常被草率处理。 - 不兼容
lambada
表达式
个人经验
-
推荐:抛出
Unchecked Exception
, 并在java doc
上说明。/** * @throws CustomUncheckedException 这是一个 unchecked excpetion */ public void test(){ throw new CustomUncheckedException(); }
-
不怎么推荐:抛出
Unchecked Exception
, 在方法签名上声明,也不需要try catch
/** * @throws CustomUncheckedException 这是一个 unchecked excpetion */ public void test() throws CustomUncheckedException{ throw new CustomUncheckedException(); }
-
不推荐:抛出
Checked Exception
,需要try catch
/** * @throws CustomCheckedException 这是一个 checked excpetion */ public void test() throws CustomCheckedException { throw new CustomCheckedException(); }
总结
优先使用 Unchecked Exceptin
, 尽量避免 Checked Exception
。目前一些 Java
框架 Spring
、Hibernate
等都只使用 Unchecked Excepiton
。在 spring
中有一个比较好的的做法是,有一个全局异常处理器,可以对异常统一进行处理。
参考资料
-
Checked exceptions: Java‘s biggest mistake
http://literatejava.com/exceptions/checked-exceptions-javas-biggest-mistake/
-
Oracle: Barry Ruzek, Effective Java Exceptions
http://www.oracle.com/technetwork/articles/entarch/effective-exceptions-092345.html