前言
在学习过程中,遇到较少的异常处理,对这方面的知识不太熟。在这次重新学习的时候整理一次。
1. 异常
1.1 分类
- 运行时异常: 可以被避免,编译时可以忽略。
- 检查时异常: 人的问题无法遇见,例如打开不存在的文件
- 错误:编译检查不到,脱离人的控制。
1.2 处理框架
- 将异常定义为类处理, Throwable是所有异常的父类。
- 异常处理分为 Error和Exception两大类。
- 在运行时异常中可以从逻辑上避免,在程序中可以处理。
2. 异常的处理
2.1 捕获异常
surround快捷键套代码,ctrl+alt+t
捕获异常可以使发生异常的程序继续运行。
- 可以写多个catch语句进行多个捕获,但是,捕获类型的顺序必须按照异常框架顺序,由低到高进行捕获。
- try和catch相关部分只有一个会执行,finally都会执行。因此释放io连接,资源等放在finally中。
public static void main(String[] args) {
int a=1,b=0;
int[] arr = {1,2,3};
try { //监控区域
// System.out.println(a/b);
System.out.println(arr[3]);
}catch (ArithmeticException e){ //处理区域
System.out.println("捕获到运行时异常");
}catch (Throwable e) {
System.out.println("所有都捕获");
}
finally { //善后工作,释放资源之类的
System.out.println("我都执行");
}
}
2.2 抛出异常
- 方法内throw 主动制造异常,方法上throws表明方法无法处理这个异常。
- 对于RuntimeException,程序会自动抛出异常。
- throw抛出异常后的代码不会继续执行。
public static void main(String[] args) {
try {
new Application().compute(2,0);
} catch (Exception e) {
System.out.println("除数不能为0");
}
}
// public void compute(int a,int b) { //运行时异常可以自动抛出
// System.out.println(a/b);
// }
public void compute(int a,int b) throws ArithmeticException{
if(b==0) {
throw new ArithmeticException();
}
System.out.println(a/b);
}
自定义异常
步骤:
- 创建自定义异常类 继承Exception
- 在方法中throw抛出
- 若在当前方法处理异常使用try-catch捕获。
- 否则在方法声明处throws抛出给方法调用者处理出现异常方法的调用者捕获并处理。
//自定义异常,方法中判断时抛出,由调用者处理。
public class MyException extends Exception{
int age;
public MyException(int age) {
this.age = age;
}
//打印对象会调用toString方法。
@Override
public String toString() {
return "MyException{" +
"age=" + age +
'}';
}
}
public static void main(String[] args) {
try {
test(12);
} catch (MyException e) {
System.out.println(e);
}
}
public static void test(int a) throws MyException{
System.out.println("传递参数为:" + a);
if(a>10) {
throw new MyException(a);
}
}