Java 异常机制
异常机制
代码在实际的敲写中,遇到的情况不可能是完美的。如:写的某个模块,用户输入不一定符合要求,或者说程序要打开某个文件,文件不存在或文件格式不对等等。这种情况我们统称为异常(Exception)。异常如果不处理的话,有可能会影响到程序的正常运行,所以,我们就需要通过,在代码的敲写中,提前预防这种情况的发生,或者说如果异常出现了,程序应该怎么处理。
-
异常主要分为三种类型:
- 检查性异常:用户错误或问题引起的异常,程序员无法预见。如要打开一个文件,而文件不存在。
- 运行时异常:运行时异常是可以被程序员避免的异常,在编译时可以可以被忽略。
- 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。
-
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
-
异常类分为两大类。错误Error和异常Exception。
异常处理机制
-
抛出异常
-
捕获异常
-
try用于监控执行的代码,如果有异常,则catch进行捕获异常
public static void main(String[] args) {
int a = 1;
int b = 0;
//try···catch 是必须使用
try{//监控区域
System.out.println(a/b);//被监控的执行代码块
}catch(ArithmeticException e){//catch(要捕获的异常类型!)捕获异常
System.out.println("程序出现异常,变量b不能为0");
}
}
- try{}catch{}必须连着使用,而catch的()中为要捕获的异常类型!
- 同时,我们可以利用多个catch进行多种异常的捕获!
try{
new Test().a();//死循环递归方法
}catch (Error e){
System.out.println("程序不能运行");
}catch (Exception e){
System.out.println("Exception");
//通过设置多重异常捕获类型,防止遗漏 从小到大!
}catch (Throwable e){
System.out.println("Throwable");
}
通过设置多重异常捕获类型,防止有遗漏的异常。由于小的异常被包括到大的异常中,所以捕获的异常类型应由小到大!
- finally用于处理善后工作
public static void main(String[] args) {
int a = 1;
int b = 0;
//try···catch 是必须使用
try{//监控区域
System.out.println(a/b);
}catch(ArithmeticException e){//catch(要捕获的异常类型!)捕获异常
System.out.println("程序出现异常,变量b不能为0");
}
//之后的IO流,和一些资源,无论有没有使用最后都需要关闭来释放资源
finally {//处理善后工作 可以不用
System.out.println("finally");
}
}
finally不论有没有被捕获到异常都会被执行,可以不被使用。而之后的IO流和一些资源,在最后都要关闭来释放,防止资源浪费!
快捷键:Ctrl+Alt+T
throw
- 主动抛出异常
- 用在方法体中,后面跟的是异常类对象名
- 只能抛出一个异常对象名
- 由方法体内的语句进行处理
public void test(int a,int b) {
if (b==0){//若符合条件,则会抛出异常
throw new ArithmeticException();
}
}
如果执行了该语句,无论有没有异常,一定会抛出一个异常,此时就需要再方法体中环绕 try···catch 来进行捕获异常,否则使用 throws进行方法外异常抛出。
throws
- 跟在方法声明后面,后面跟的是异常类名
- 可以跟多个异常类名,用逗号隔开
- 表示抛出异常,调用该方法的使用者要进行异常捕获处理,否则爆红
- throws表示该方法有出现异常的可能性,不一定会出现异常
public static void main(String[] args) {
try {
new Test3().test1(1,2);
} catch (Exception e) {
System.out.println(11);
}
}
public void test1(int a,int b) throws Exception{
System.out.println(a+b);
}
总的来说,throw写在方法体中,由方法内部去处理会出现的异常,它更像是人为去认定异常。而throws则是把问题丢给了使用方法的使用者,由机器去认定异常的发生,并由使用者去捕获处理异常。
自定义异常
- 继承父类Exception类
- 根据异常类型,定义构造方法
- 打印输出异常信息
public class MyException extends Exception{
//传递数字
private int detail;
//定义构造器
public MyException(int a) {
this.detail = a;
}
//打印异常的信息
@Override
public String toString() {
return "MyException{" +
"detail=" + detail +
'}';
}
}
这样,一个自定义异常类就定义好了,用法和正常的异常类型一样!
异常实际应用中的经验总结
- 处理运行时异常时,采用逻辑去合理规避同时辅助 try-catch 处理
- 在多重catch块后面,可以加一个catch(Exception)来处理可能被遗漏的异常
- 对于不确定的代码,也可以加上 try-catch,处理潜在的异常
- 尽量去处理异常,切忌只是简单地调用 printStackTrace() 去打印输出
- 尽量添加finally语句块去释放占用的资源
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY