异常处理机制】 Java异常处理try-catch-finally的执行过程?

2021-11-11 09:39发布

11条回答
一个Ai
2021-11-11 15:36

第一种情况:


private static int inc() {

int i;


try {

i = 1;


return i;


} catch (NullPointerException e) {

i = 2;


return i;


} finally {

i = 3;


}


}


运行过程: 当程序执行至i=1后,准备执行下一行return之前会将i复制到最后一个本地变量表的Slot中*,简单的理解就是程序在最后执行return之前会将需要返回的值给复制到指定的用来做返回值的位置,这里就统一叫做returnValue,此时returnValue=1。然后执行finally代码,执行x=3,最后返回returnValue=1;


注意:*表示该语句摘自《深入理解JAVA虚拟机》第188页中间段落开头。


第二种情况:


private static int inc() {

int i;


try {

i = 1;


if (i == 1) {

throw new NullPointerException();


}


return i;


} catch (NullPointerException e) {

i = 2;


return i;


} finally {

i = 3;


}


}


运行过程: 当程序执行至i=1后进入if语句,然后抛出异常且被catch住,程序开始执行catch代码块,i=2,在执行下一句return i 之前,会使returnValue=2。然后执行finally代码,执行x=3,最后返回returnValue=2(此时执行的是catch中的return);


第三种情况:


private static int inc() {

int i;


try {

i = 1;


if (i == 1) {

throw new RuntimeException();


}


return i;


} catch (NullPointerException e) {

i = 2;


return i;


} finally {

i = 3;


}


}


运行过程: 当程序执行至i=1后进入if语句,然后抛出异常但是没有被catch住,程序开始执行finally代码块,i=3,finally代码块结束。由于该异常没有被catch住,程序将异常抛出给方法调用方去处理,所以代码执行结果为Exception in thread "main" java.lang.RuntimeException。


第四种情况:


private static int inc() {

int i;


try {

i = 1;


if (i == 1) {

throw new RuntimeException();


}


return i;


} catch (NullPointerException e) {

i = 2;


return i;


} finally {

i = 3;


return i;


}


}        运行过程: 当程序执行至i=1后进入if语句,然后抛出异常但是没有被catch住,程序开始执行finally代码块,i=3,然后执行return i语句之前会使returnValue=3,最后结果为3;


另外,由于finally代码块语句是在会在程序结束前全部执行完毕,因此如果在上面几种情况下finally代码块都有renturn i时返回值均为3;


总结:在每次执行完return语句上一行代码后均会先将返回值给赋予returnValue,最后返回时也是将returnValue返回。


一周热门 更多>