Checked Exception VS Unchecked Exception
- Checked Exception 在编译时会检查的异常,如果在代码中有一个方法会抛出Checked Exception, 会当前方法必须处理 (catch) 这个异常,或者用throws关键词抛出这个异常。
import java.io.*class Main {
public static void main(String[] args) {
String filename = "/home/root/a.txt";FileReader fr = new FileReader(filename);BufferedReader br = new BufferedReader(fr);// just read a lineSystem.out.println(br.readline());// close the resourcebr.close();}}
output
Main.java:11: 错误: 未报告的异常错误FileNotFoundException; 必须对其进行捕获或声明以便抛出FileReader fr = new FileReader(filename);^
Main.java:14: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出System.out.println(br.readLine());^
Main.java:16: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出br.close();^
3 个错误
Check Exception是必须要程序员处理的异常,
- Unchecked Exception是编译时不作检查的异常,而是将该检查交给程序员来处理。
Throwable/ \Error Exception| / \(unchecked) ... RuntimeException| |(checked) (unchecked)
Error和RuntimeException是unchecked excpetion, 其余的是checked exception
为什么要设计出Unchecked Exception和Checked Exception呢?
以下全是个人理解
Unchecked Exception
首先unchecked exception只有Error及其子类,RuntimeException及其子类。
如果Error一旦发生,说明程序已经出现致命的错误,在无法在程序中进行处理。所以它是错误,是没有办法处理的。所以Error不需要处理。
如果是RuntimeException,故名思义,运行时异常,在运行才能被检测出来是否是异常。
运行时异常没有办法判断。所以设计者将它定义为unchecked, 不强制程序处理这种异常。不处理这种异常的好处就是,代码更加简洁,将它抛给最上层的调用者,由最上层的调用者负责。
哪些异常应该作为Unchecked Exception呢?
在程序中出了异常,可以向上抛不会对当前逻辑造成影响,比如NullPointException
在Java Web中我们可以自定义RuntimeException,用来处理请求参数异常、数据库异常等,在Controller端统一处理。
Checked Exception
除了RuntimeException及其子类的Exception都是checked exception,比如:
IOException, BrokenBarrierException, TimeoutException等
其实Checked Exception是指那些出了问题要马上处理的异常,比如IOException,TimeoutException,不处理就可能会有大问题。
哪些异常应该作为Checked Exception呢?
在程序中出了异常,应该立马处理,否则会造成资源浪费,甚至造成文件损坏等,这些异常应该被作为Checked Exception