- try{}、catch{}、finally{}中是否可以包含return语句?
- 三个语句中都可以写return,但是一般finally中不写return,因为会造成返回结果有问题。
- 如果try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会执行?
- 一定会执行。
finally无返回值
public class TestFianlly {
public static void main(String[] args) {
System.out.println(getNum());
}
public static int getNum(){
int num=10;
try {
System.out.println("try");
return num++;//num++要看成整体,先返回10,后增加
}catch (Exception e){
return num++;
}
finally {
num++;
System.out.println(num+" finally");
}
}
}
输出结果:
try
12 finally
10
try中return要等Fianlly中语句执行完才会返回,但是会把值保存,故返回的是10,而不是12
部分JVM指令
exception表
innc指令
对指定的int类型的变量进行+1或+2操作,如i++,i–或i+=2;iinc操作是有参数的此操作对应于自加操作,并且该操作不对stack有任何改变
根据描述可知该指令是需要指定参数的,1.指定变量,2.指定步帧
因此它的结构应该是 iinc slot_ , number ,即,对指定slot_n的变量进行+=number的操作
0~2行 将10压如栈中,在保存到本地表里的slot_0中
11行 将10放入操作数栈
12行 innc 对slot_0进行加一操作 这里对应 try中的num++
15行 将10保存至变量表slot_1中
16行 innc 对 stot_0进行加一操作 对应finally中的num++
44~45行 将slot_1加载至栈中 并返回
num的值对应slot_1 这个值最后变为了12,故finally中输出12
而返回值保存在slot_1中 从开始打最后都是10 ,故返回10
finally中有返回值
public static int getNum1(){
int num=10;
try {
System.out.println("try");
return num++;//num++要看成整体,虽之后
}catch (Exception e){
return num++;
}
finally {
System.out.println(num+" finally");
return num++;
}
}
try
11 finally
11
finally一定会执行,try中return还没有执行,finally中return就已经返回值,并结束了方法
finally返回的是 slot_0中的数据