Java中的Checked和Unchecked异常
作者:互联网
Java中的Checked和Unchecked异常
在上课过程中讲述了Checked和Unchecked类型的异常,下面对其划分和处理进行归纳整理。
首先
Java异常分为两种类型,checked异常和unchecked异常,这是从异常处理机制的角度所做的分类,check即编译器检查程序是否已经抛出或处理了可能的异常。下面给出其划分,其中红色框架及其子类型为Uncheck类型异常,蓝色框架及其子类型为checked类型异常。
Checked异常
Checked异常是Exception类的子类中除去运行时异常的所有其他异常类,如IO异常,这类异常必须被捕获并进行处理,否则编译就无法通过,异常被捕获之后需要进入异常处理,可以通过thorws、throw、try catch和finall来进行:
- throws:声明本方法可能会发生xx异常;
- throw:抛出xx异常;
- try catch、 finally:捕获并处理异常;
下面给出一个checked异常的代码示例:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class Main {
public static void main(String[] args) {
File f = new File("C:\test.txt");
FileReader r = new FileReader(f); //A
BufferedReader br = new BufferedReader(r);
br.readLine(); //B
br.close(); //C
}
}
这段代码不能通过编译,原因是A,B和C行会抛出IOException,必须将这段代码放入try-catch块中,或者给main方法加上throws IOException才能编译。
Unchecked异常
Unchecked异常包括运行时异常和Error,由于运行时异常和Error异常都是在编译阶段无法发现的,只有程序运行时才能发现的异常,所以编译器在编译时无法对其进行检查,这类异常是不需要在编译的时候用try catch、throws等机制来处理的,编译可以通过,执行时如果出现就直接导致程序失败;
其中典型的运行时异常有空指针、数组访问越界等,通常是程序的逻辑错误引起的;
Error类
Error类描述的是java运行时系统内部出现的错误和系统资源不足的异常情况,比如用户输入错误、设备错误或者物理限制(内存不足等),程序员对于这些内部错误通常是没有办法解决的,一旦发生需要想办法让程序优雅的结束;
一些典型的Error:
- VirtualMachineError:Java虚拟机坏了或者内存不足以支持继续运行
- OutOfMemoryError:无法再分配并且垃圾回收程序也不能再提供可用的内存
- StackOverflowError:栈移除错误,递归调用很多次会出现
下面给出一个unchecked异常的代码示例:
public class Main {
public static void main(String[] args) {
int a = 0;
int b = 100;
int c = b/a;
}
}
该段代码可以编译,但执行会报错。ArithmeticException是一个unchecked异常。
Exception in thread “main” java.lang.ArithmeticException: / by zero
at Main.main(Main.java:13)
二者对比
Checked exception | Unchecked exception | |
---|---|---|
基本区别 | 必须被显示地捕获或者传递, 否则编译无法通过 |
异常可以不被捕获或抛出, 编译器不检查 |
分类 | 继承自Exception类,除了运行时异常其他的子类 | 运行时异常及其子类,Error类 |
处理策略 | 从异常发生的现场获取详细的信息, 利用 异常返回的信息来明确操作失 败的原因, 并加以合理的恢复处理 |
简单打印异常信息,无法再继续处理 |
表示 | 代码看起来较复杂 | 简单清晰 |
所以总的来说,异常可以分类为Unchecked和Checked两种,是针对编译器是否在编译时检查这类异常来讲的,前者包括运行时异常和Error类,都是编译时无法预测的,不需要进行异常处理,编译器可以通过;剩余的Exception子类都是Checked异常,必须使用throw、throws、try catch和finally来捕获并处理,处理一般输出导致错误的原因,并提供恢复的一些操作。
一些观点
编译器强制捕获或者抛出unchecked异常使开发人员时刻记着要处理异常。
抛出checked异常的方法必须声明throws,throws成为了方法或者接口的一部分,给后续版本增加或者修改方法的异常带来不便。
unchecked异常不需要显式地处理反而使异常处理变的困难。
调用checked异常的方法,就必须处理这个方法的异常,这使得上层的调用者代码混乱。
选择checked还是unchecked都是由你自己决定的,很难说哪种就一定正确,反之就一定错误。目前比较流行的语言中,Java似乎是唯一支持checked异常的语言,其他语言都只有unchecked异常。
标签:Java,处理,unchecked,编译,checked,Checked,异常,Unchecked 来源: https://www.cnblogs.com/hit-rhino54/p/16361762.html