2021-11-11 09:39发布
第一种情况:
private static int inc() {
int i;
try {
i = 1;
return i;
} catch (NullPointerException e) {
i = 2;
} finally {
i = 3;
}
运行过程: 当程序执行至i=1后,准备执行下一行return之前会将i复制到最后一个本地变量表的Slot中*,简单的理解就是程序在最后执行return之前会将需要返回的值给复制到指定的用来做返回值的位置,这里就统一叫做returnValue,此时returnValue=1。然后执行finally代码,执行x=3,最后返回returnValue=1;
注意:*表示该语句摘自《深入理解JAVA虚拟机》第188页中间段落开头。
第二种情况:
if (i == 1) {
throw new NullPointerException();
运行过程: 当程序执行至i=1后进入if语句,然后抛出异常且被catch住,程序开始执行catch代码块,i=2,在执行下一句return i 之前,会使returnValue=2。然后执行finally代码,执行x=3,最后返回returnValue=2(此时执行的是catch中的return);
第三种情况:
throw new RuntimeException();
运行过程: 当程序执行至i=1后进入if语句,然后抛出异常但是没有被catch住,程序开始执行finally代码块,i=3,finally代码块结束。由于该异常没有被catch住,程序将异常抛出给方法调用方去处理,所以代码执行结果为Exception in thread "main" java.lang.RuntimeException。
第四种情况:
} 运行过程: 当程序执行至i=1后进入if语句,然后抛出异常但是没有被catch住,程序开始执行finally代码块,i=3,然后执行return i语句之前会使returnValue=3,最后结果为3;
另外,由于finally代码块语句是在会在程序结束前全部执行完毕,因此如果在上面几种情况下finally代码块都有renturn i时返回值均为3;
总结:在每次执行完return语句上一行代码后均会先将返回值给赋予returnValue,最后返回时也是将returnValue返回。
最多设置5个标签!
第一种情况:
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返回。
一周热门 更多>