java中关于Exception的一些内容
为什么要学习异常呢?首先关于异常这个概念,它不是错误...
异常是程序本身可以捕获并且可以处理的,它是java为我们提供的用来处理一些棘手的情况,提升程序健壮性的一个可以利用的手段,所以我们要正视异常理解异常。
Java中的Checked和Unchecked异常
Java异常分为两种类型,checked异常和unchecked异常,这是从异常处理机制的角度所做的分类,Checked即编译器检查程序是否已经抛出或处理了可能的异常。Uncheck即编译阶段不会对其做出处理要求,只有到运行阶段才会影响程序。
Checked异常
Checked异常是Exception类的子类中除去运行时异常的所有其他异常类,如IO异常…… 这类异常必须被捕获并进行处理,否则编译就无法通过,异常被捕获之后需要进入异常处理,可以通过thorws、throw、try catch和finall字段:
- throws:声明本方法可能会发生异常;
- throw:抛出异常;
- 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语句中,或者给方法加上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这样的区分是唯一支持checked异常的语言,其他语言都只有unchecked异常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!