异常的体系结构
![](https://img-blog.csdnimg.cn/img_convert/38db2866264ddacb04af1b463ee03127.png)
JVM默认处理异常的方式
1.- 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
2.- 程序停止执行
try-catch方式处理异常
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}
执行流程
- 程序从 try 里面的代码开始执行
- 出现异常,就会跳转到对应的 catch 里面去执行
- 执行完毕之后,程序还可以继续往下执行
Throwable成员方法
public String getMessage()返回此 throwable 的详细消息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace()把异常的错误信息输出在控制台
编译时异常和运行时异常的区别
编译时异常
- 都是Exception类及其子类
- 必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常
- 都是RuntimeException类及其子类
- 无需显示处理,也可以和编译时异常一样处理
运行时异常与一般异常
运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。RuntimeException 体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException 的原则是:假如出现 RuntimeException,那么一定是程序员的错误,例如,可以通过检查数组小标和数组边界来避免越界访问异常。
一般异常:定义方法时必须声明所有可能会抛出的checked exception;在调用这个方法时,必须捕获它的checked exception,不然就得把它的exception传递下去;checked exception是从java.lang.Exception类衍生出来的。
throws,throw,try,catch,finally分别代表什么意义?
throws:获取异常。
throw:抛出异常。
try:将会报出异常的语句括起来,然后进行异常处理。
catch:如果有异常会就会指向catch语句里面的内容。
finally:不论是否有异常都会执行的语句。
try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前,执行完try里面的代码之后将数据存储进去return中,然后在返回之前,先执行了finally 内的内容,执行完finally中的内容之后在返回执行return。
例题
public class VariableDemo01 {
static void methodA() {
try {
System.out.println("进入方法A");//1.输出"进入方法A"
throw new RuntimeException("制造异常");//3.输出"制造异常"
} finally {//由于finally是每次代码都会执行的,执行完之后在回去执行throw
System.out.println("用A方法的finally");//2.输出finally的语句"用A方法的finally"
}
}
static int methodB() {
try {
System.out.println("进入方法B");//4.输出"进入方法B"
// throw new Exception();
return 1;//执行完finally方法后,才来执行return方法,因为return方法在finally方法后执行
} catch (Exception e) {
return 3;
} finally {//同样,finally方法执行完try之后来执行
System.out.println("调用B方法的finally");//5.输出"调用B方法的finally"
// return 2;
}
}
public static void main(String[] args) {//先看主函数
try {
methodA();//找到methodA方法
} catch (Exception e) {//由于执行了RuntimeException,所以回来执行catch方法,
System.out.println(e.getMessage());//找到methodB方法
}
int i = methodB();//这个时候methodB方法return 1,所以i=1
System.out.println(i);//6.输出i=1.
}
}
进入方法A
用A方法的finally
制造异常
进入方法B
调用B方法的finally
1