程序运行的结果为17。
测试代码如下:
public class Testtrycatchfinally {
public static int test(int a,int b) {
int id=0;
try {
// 第一次调用test,id+=1执行完,id=1
// 第二次调用test,发生除0运算,id+=1不执行
a=a/b;
id+=1;
System.out.println("a="+a+", b="+b+", id="+id);
}catch(Exception e) {
// 第二次调用test,执行a=a/b,发生异常,跳转到catch,执行id+=2,id=2
id+=2;
System.out.println("a="+a+", b="+b+", id="+id);
}finally {
// 第一次调用test,id+=3执行完,id=4
// 第二次调用test,id+=3执行完,id=5
id+=3;
System.out.println("a="+a+", b="+b+", id="+id);
}
// 第一次调用test,id+=4执行完,id=8
// 第二次调用test,id+=4执行完,id=9
id+=4;
System.out.println("a="+a+", b="+b+", id="+id);
return id;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// 下面行执行完,x为第一次调用test()的返回结果,其值为8
int x = test(0,1);
System.out.println("x="+x);
// 下面这行执行完,x累加第二次调用test()的返回结果,其值为9
// 所以最后x=8+9=17
x+=test(1,0);
// 最后的打印结果为17
System.out.println(x);
}
}
运行时常量池( Runtime Constant Pool
)是方法区的一部分,类加载器加载字节码文件时,将常量池表加载进方法区的运行时常量池。运行时常量池中包含多种不同的常量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或者字段引用。此时不再是常量池中的符号地址了,这里换为真实地址。
运行时常量池,相对于 Class 文件常量池的另一重要特征是:具备动态性,比如
String.intern()
。
输出 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 0, 1, 0, 2, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]
[1, 5, 5, 7, 9, 12, 23, 34, 34]