try {}里有一个 return 语句,那么紧跟在这个 try
后的 finally {}里的 code 会不会被执行,什么时候被执
行,在 return 前还是后? 我知道finaly应该是在return之前执行,可是下面的代码为什么执行的时候结果会是1呢?
public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new Test().test());;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
}
}
}
后的 finally {}里的 code 会不会被执行,什么时候被执
行,在 return 前还是后? 我知道finaly应该是在return之前执行,可是下面的代码为什么执行的时候结果会是1呢?
public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new Test().test());;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
}
}
}
解决方案 »
- ActionSupport代替action获取不到bean 引用错误 《急救》····
- 求救!有关spring+hibernate父子关系的级联删除问题
- 江湖救急啊!Apache+Tomcat系统整合后验证码不能显示的问题??????急啊
- 新人问题:关于如何让数据库中2个表之间互相传递数据?
- 打成jar包就不能被sping的context:component-scan找到了吗?
- weblogic8.1连接mysql
- 第一次碰struts,编译报错UserForm.java:2: package org.apache.struts.action does not exist
- 改写一个Servlet就要重启一次Tomcat吗?真麻烦。
- 怎样生成创建一个文件
- EJB的好书,请推荐,我看了<精通EJB2.0>,好薄哟!!
- jasperreports web打印 没反应
- mybatis在xml文件中该如何定义复合主键
你再finally 外边 输出x 就变成2了
finally里一般执行清扫工作,比如关闭连接等,如果finally先执行的话,请问要try干嘛
接着,转入finally块继续执行,如果finally块没有返回语句,执行完finally块,再回到try块,执行return语句.
注意: 这种执行顺序只是保证了finally块一定会被执行, 但finally块的执行结果对try块的return没有影响.
如果finally里面有return,try中的return不会再执行
如果try中有了异常,try中的return也不执行
程序在catch块中的执行情况,和try块是一样的
http://topic.csdn.net/u/20111009/19/dc661ee7-ab58-4ee3-931d-93a7630d18f2.html也就是说,函数返回值是当时运行到return这行时候整个return 表达式的结果,也就是当时x的值。
而不是到了return再去执行finally,然后回过头来再去运行return 表达式,求当时(finally运行以后)表达式的值
只是有点不明白finally执行之后X的值应该是2,return返回X的值也应该是2才对
try{
System.out.println(1);
return;
}finally{
System.out.println(2);
}
static int test();
Code:
Stack=1, Locals=3, Args_size=0
0: iconst_1 //常量1压栈
1: istore_0 //把栈顶元素存储到局部变量0里面
2: iload_0 //把局部变量0压栈
3: istore_1 //把栈顶元素存储到局部变量1里面
4: iinc 0, 1 //局部变量0加1
7: iload_1 //把局部变量1压栈
8: ireturn //返回栈顶元素
9: astore_2 //异常信息存储在局部变量2里面
10: iinc 0, 1 //局部变量0压栈,加1
13: aload_2 //局部变量2压栈
14: athrow //抛出栈顶元素第4条指令:
4: iinc 0, 1 //局部变量0加1
这就是执行finally里面的内容看第7条和第8条指令:
7: iload_1 //把局部变量1压栈
8: ireturn //返回栈顶元素
这是return语句。
这是我修改你的程序,研究的
public class Test { public static void main(String[] args) {
System.out.println(new Test().test());;
}
static int test()
{ int x = 1;
System.out.println(x);
try {
try{
System.out.println(x);
return x;
}
finally{
x++;
System.out.println(x);
return x;
}
}
finally {
System.out.println(x);
}
}
}