异常处理
结构体系
Throwable 所有异常的父类,几乎所有的异常都定义在这个父类中,子孙类基本没有特有方法
Error 错误:不能通过程序的方式解决,如内存溢出等严重错误
Exception 编译异常,必须得处理,否则编译报错
Runtimeexception 运行时异常,编译异常的子类,不强制处理,在运行时候可能报错
异常默认处理方式
1、在某个方法中,出现了和生活情况不同的数据时,没有必要继续往下执行,所以将这种情况封装成一个对象(异常对象)
2、将这个异常对象(通过throw)抛出给调用者,一层一层向上抛出,一直到主方法中
3、主方法也没有办法处理,抛出给jvm虚拟机
4、Jvm虚拟机,就将异常对象中的所有信息,使用标准错误流进行打印(在eclipse显示红色),将jvm结束掉
关键字
throw
主动抛出异常,在程序无法执行时,抛出异常,以便调用者进行下一步处理
throws
放在方法末尾,声明异常,作用是表示此方法不处理该异常,所声明的异常由调用者处理,如果一直抛到主方法都没有处理方法,就由jvm打印出异常信息
finally
无论怎样都会执行,就算try语句中要执行return语句也会先执行finally
public class FinallyTest03 {
public static void main(String[] args){
int i = m1();
System.out.println(i);
}
public static int m1(){
int i = 10;
try{
return i;
//这里没有catch,所以不用在后面写return了
}finally{
i++;
System.out.println("finally中的i=" + i);
}
}
}
输出结果:.程序在执行到return i时,会先将i赋给一个临时变量,return的是这个临时变量:int temp = i;return temp;,然后再执行finally中的语句,打印出了11,之后再执行main方法中的语句,打印出10。
catch
可以捕捉多个异常,但是catch里面必须从小类型异常到大类型异常进行捕捉,先捕捉子后捕捉父,最多执行一个catch语句块里面的内容。
jdk7新特性,可以将多个捕捉的异常放到一个catch里面catch (FileNotFoundException | ArithmeticException e)
定义这么多异常子类,却又都没有特有方法的原因
1.需要使用不同的异常名称,描述不同的异常情况,方便写程序的时候能很快找到错误原因
2.如果有了不同的异常类型,可以在catch块中,根据不同异常类型,做不同的处理