在日常的JAVA开发中,我们会经常用到try-catch-finally来显示的处理程序在编译时和运行时可能会发生的异常,但是有时候会不清楚在不同情况下程序的返回值是什么,下面表述我的个人理解:
第一种情况:
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返回。