下面 先给出几个指令
jsr 把返回地址压入栈,跳转至偏移量指定位置处执行分支操作。
ret 返回存储在局部变量index中的地址。
下面给出一个例子
package MERAN;
public class Test{
public boolean handle(int i){
while(i==1)
try{
return true;
}
finally{
break;
}
return false;
}
public static void main(String[]args){
Test t=new Test();
t.handle(1);
}
}
这个例子无论 i 是什么值 返回的都是 false。
jsr指令把 返回地址压入栈,当每一个子例程开始,也就是finally指令开始执行的时候,弹出 返回地址并把它存入局部变量中,当执行ret指令的时候在从局部变量中取出。
这样设计是有好处的,因为如果finally中因为break continue return 或者异常结束的时候,ret 指令将不会执行,所以这样设计就可以不必考虑这个问题了。
当finally正常执行完毕的时候,ret'将返回地址从局部变量中取出,并返回。 非正常结束的时候,ret 不执行,所以返回地址无效。