在java中,规定先执行finally中的代码,再return。但是看过这么一段代码,如下
public class Bruce
{
static int deal(int a)
{
try{
a++;
return a;
}
finally
{
a++;
}
}
public static void main(String[] args)
{
System.out.println("The result is "+deal(5));
}
}得到结果为:The result is 6我认为当执行到return a;时,程序将变量a保护起来,再执行finally中代码,最后return a的值不知道各位怎样认为?
解决方案 »
- 如何用Java做插件式软件开发?
- 处理粘包和半包问题的socket分包Java实现
- 在一个非web的程序中,如何使用java来抓取google的搜索结果
- 求救: jdbc 的lockWaitTime属性为什么没有超时效果,一直等待到锁释放?
- 有个关于gui多线程的问题
- 关于socket Connection reset的问题
- http://www.2qq.cn/vip.htm?qq=282232 腾讯过大年,六位数的QQ不要要钱,点击马上申请!看看有分。呵呵,
- 请问哪一种map是按加入的顺序存储的?
- 请问私有的构造方法和其他的私有方法有什么特殊的地方吗?
- JDBC连接SQL2000的例子,谁有?
- 呵呵,傻呼呼的,写完了代码没有放出地址,重新放出下载地址,JAVA版本的仙剑邀请大家一起完成
- 还是数组的问题
static int deal(int a)
{
try{
a++;
return a;
}
finally
{
a++;
System.out.print("finally");
}
}
结果:
finally6可以看出finally
中的代码在return前执行.
try裏面的return已經返回值了,因此雖然finally里的語句執行到了,卻不能對return有影響,所以得到的結果是6
樓主的説法我贊成
static T deal(T t) {
try {
t.s = "in try";
return t;
} finally {
t.s = "in finally";
System.out.println(t);
}
} public static void main(String[] args) {
T t = new T();
System.out.println(deal(t));
}}class T {
String s;
public String toString() {
return s;
}
}
当程序运行到return时,jvm把返回值保存在一个临时的对象中去了。并不是说程序在此时退出。相反程序需要执行finally中的语句。不管是什么情况,只要有finally语句,程序最后都要执行。
public Bruce();
static int deal(int);
public static void main(java.lang.String[]);
}Method Bruce()
0 aload_0
1 invokespecial #1 <Method java.lang.Object()>
4 returnMethod int deal(int)
0 iinc 0 1
3 iload_0
4 istore_1
5 jsr 16
8 iload_1
9 ireturn
10 astore_2
11 jsr 16
14 aload_2
15 athrow
16 astore_3
17 iinc 0 1
20 ret 3
Exception table:
from to target type
0 8 10 any
10 14 10 anyMethod void main(java.lang.String[])
0 getstatic #2 <Field java.io.PrintStream out>
3 new #3 <Class java.lang.StringBuffer>
6 dup
7 invokespecial #4 <Method java.lang.StringBuffer()>
10 ldc #5 <String "The result is ">
12 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)>
15 iconst_5
16 invokestatic #7 <Method int deal(int)>
19 invokevirtual #8 <Method java.lang.StringBuffer append(int)>
22 invokevirtual #9 <Method java.lang.String toString()>
25 invokevirtual #10 <Method void println(java.lang.String)>
28 return
当执行到return时,会把当前的a(a=6)值压栈,再去执行finally代码段把处理后的a值(a=7)压到另一地方,返回的时候,JVM取的是第一次压栈的值a=6
执行完finally再load a值返回。
要啥版本?
你只需要javap -c classname 就行了 !
^_^
在return之前,finally里的语句都会执行.在finally之前回保存,基本类型保存的是值,而对象保存的是引用.在finally执行之后,会load保存的值返回.楼主的例子里是基本类型所以返回的值是6,而forair(forair) 的例子里保存的是T的引用,所以finally中改变了T中的值,当return的时候,返回的是T的引用,所以后来print的结果都是"in finally"
“在非void函数过程体中,可以有任意多个return语句,但只返回运行过程中的第一个返回参数。”
所以当运行到第一个return语句时,返回参数就已经被锁定了,不过深入查看指令代码确实让我们大家又理解了JAVA底层是如何实现的。^^另:在void函数体中,运行时一旦遇到return;语句,则立刻离开函数体,但无论如何finally块中的语句将始终执行。
@.@||~
{
try{
a++;
return a;
}
finally
{
a++;
System.out.print("finally");
return a; //加上此句
}
}
不知道能否這樣理解!
請高人分析!up!@~~~~~~~~~~~~~~~