什么是Java的异常体系?参考博客:Java基础——运行时异常和非运行时异常
Java异常的处理方式
throw
throw
是Java中的一个关键字,可以在方法上声明抛出一个异常,如果方法体中发生了异常,那么方法会通过throw
关键字将异常抛出。- Java使用throw关键字抛出异常后,会抛给调用该方法的上一层方法,如果该异常是非运行时异常,那么调用该方法的上一层方法,也需要进行异常处理,
throw
或者try{}catch{}
。 - 如果该方法声明抛出后,方法中发生了异常,而且该方法是最顶层的方法,没有其他方法调用该方法,那么异常就会被抛给JVM,由JVM进行异常处理。
try{}catch{}
- 在Java的异常体系之中,除了使用
throw
关键字将异常声明抛出之外,还可以使用try{}catch{}
的方式将异常捕获。 - Java的异常中,非运行时异常,Java代码编译规定必须进行显式处理的,要么使用
throw
进行抛出,要么就使用try{}catch{}
进行异常的捕获。
try{}catch{}的执行顺序
正常情况
- 如果是正常情况,代码中没有异常发生,那么代码只会执行try{}中的代码,而catch{}中的代码不会执行。正常情况下,以上代码的执行结果是:
1
2
3
4
5try {
System.out.println("代码正常执行......");
} catch (Exception e) {
System.out.println("代码发生异常后执行......");
}1
代码正常执行......
发生异常
- 如果try{}中的代码发生了异常,那么发生异常前的代码会正常执行,而try{}中发生异常后的代码将不会再执行(除了
return
之外),而是执行catch{}中的代码。发生异常的情况下,以上代码的执行结果是:1
2
3
4
5
6
7try {
System.out.println("代码正常执行......");
int i = 1/0;
System.out.println("代码发生异常了......");
} catch (Exception e) {
System.out.println("代码发生异常后执行......");
}1
2
3代码正常执行......
代码发生异常后执行......finally代码块
finally
是try{}catch{}
体系中的一部分,全部代码书写为try{}catch{}finally{}
。- finally代码块的特点是,无论try{}中是否发生了异常,最后都会执行finally中的代码。
正常情况
1 | try { |
正常情况下,以上代码的执行结果是:
1 | 代码正常执行...... |
发生异常
1 | try { |
发生异常的情况下,以上代码的执行结果是:
1 | 代码正常执行...... |
try{}catch{}finally{}中的return
以上的情况都是方法是无返回值的情况,如果方法是有返回值的,并且在try{}catch{}finally{}中都有return,那么方法该return那个返回值呢?
return的位置
在探索try{}catch{}finally{}
中return
的时机之前,我们先根据return的位置,定义一下return
的类型。
1 | private static String test() { |
return的规则
最终return
和方法return
是互斥的,即在一个方法中,最终return
和方法return
只能写一个,否则编译无法通过(或者IDE会报错)。- 当
正常return
和异常return
都有的时候,最终return
可有可无,但是方法return
一定不能有,否则报错。 - 当有
最终return
的时候,正常return
和异常return
可有可无。 - 当没有
最终return
的时候,要么一定要有正常return
和异常return
,要么一定要有方法return
。
return的执行顺序
当方法中return的时候,那么try{}catch{}finally{}
中的代码顺序又该怎么执行呢?
首先,我们来看一下代码:
1 | public static void main(String[] args) { |
该段代码的执行结果是:
1 | try:start |
如果我们去掉finally中的return的话:
1 | public static void main(String[] args) { |
执行结果为:
1 | try:start |
return的执行顺序分析图
如果try中发生异常,代码跳转至catch{}
中执行,那么return
的执行顺序和原理是和try{}
中是一致的。