黑马程序员技术交流社区
标题:
finally的不理解
[打印本页]
作者:
熊永标
时间:
2013-4-9 17:12
标题:
finally的不理解
import java.util.concurrent.Callable;
public class Hello {
public static void main(String[] args) {
System.out.println(tryTest());
}
public static String tryTest(){
String s=null;
try {
s="aa";
return s;
} finally {
s="bb";
}
}
}
复制代码
为什么finally修改的值不会影响到返回值呢?
作者:
郭彦君
时间:
2013-4-9 18:06
没返回,finally里加个return s。
public class Temp {
public static void main(String[] args) {
System.out.println(tryTest());
}
public static String tryTest(){
String s=null;
try {
s="aa";
return s;
} finally {
s="bb";
return s;
}
}
}
复制代码
作者:
王怀亮
时间:
2013-4-9 18:38
你的代码貌似不能正常运行吧,这是有错误的,java规定,一个try后面必须至少接一个catch,可以不接finally,但是最多只能由一个finally,你的程序没有catch块,怎么能正常运行呢?剩下的事情楼上都说了,就是因为你的try里面已经写了return,当程序遇到return时,就会返回return后的变量的值,并且跳出函数,你的程序try中的return前没有错误,所以可以正常运行到return,这时函数中的剩余代码就不执行了
作者:
张源锋
时间:
2013-4-9 18:57
我用Eclipse里的Debug功能试了下,执行到return语句时没有直接返回,而是先去执行了finally里的语句,最后在返回来执行return s语句,至于finally修改的值不会影响到返回值,可能是在第一次执行到return s时,程序已经在内存里把return s(这时的s='aa')挂起来了,等到执行完finally里的语句时直接返回;
作者:
hacket
时间:
2013-4-9 19:34
public class FinnallyDemo {
public static void main(String[] args) {
System.out.println(tryTest());
}
public static String tryTest(){
String s=null;
try {
s="aa";
return test(s);
} finally {
s="bb";
System.out.println("执行了finally");
return s;//若这个return s没有,则不会覆盖s的值,还是原来的值
}
}
public static String test(String s){
System.out.println("test :");
return s;
}
}
复制代码
执行过程分析:
1.try语句块,return test(s),则调用test()方法
2.test()执行后返回s,返回值s保存在一个临时区域里
3.执行finally语句块。若finally语句有返回值,则此返回值将替换掉临时区域的返回值
4.将临时区域的返回值送到上一级方法中。
作者:
Keith
时间:
2013-4-9 20:45
内存中是这样的
执行 return 的时候会在内存中有个returnValue 存储 返回值
s="aa";
return s;
这时returnValue 值已经是aa,但是还要执行finally语句中的语句,执行完后 s的值是bb,但是返回的是还是returnValue 所以是aa
可以参考对比2楼的例子,2楼中在
finally {
s="bb";
return s;
}
此时returnValue 变为bb,再返回,这时try中的return就不在运行
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2