黑马程序员技术交流社区
标题:
偶见一段代码,好像有点不是太明白,
[打印本页]
作者:
李方哲
时间:
2011-9-27 03:10
标题:
偶见一段代码,好像有点不是太明白,
[code=java]public class Test {
public static void main(String[] args) {
System.out.println(test());
}
public static String test() {
try {
System.out.println("try block");
return test1();
} finally {
System.out.println("finally block");
}
}
public static String test1() {
System.out.println("return statement");
return "after return";
}
} [/code]
经过运行,结果是:
try block
return statement
finally block
after return
为什么finally block会在after return之前出现呢,
作者:
匿名
时间:
2011-9-27 07:17
李芳哲同学你好[code] public static void main(String[] args)
{
System.out.println(test());
}
public static String test()
{
try {
System.out.println("try block"); //1
return test1();
}
finally
{
System.out.println("finally block"); //3
}
}
public static String test1()
{
System.out.println("return statement"); //2
return "after return"; //4
}
}[/code]我们仔细看一下
1首先System.out.println(test());
2先执行test(),好,那么System.out.println("try block"); //1 没有问题
3接着test()里有return test1(); 这就要先执行test1()里的System.out.println("return statement"); //2
然后将返回值return "after return"; //4交给test(),rest()的返回值最终是由System.out.println(test()); 打印的!!!
然而此时 test()已经结束(因为将值返回)函数运行完毕,
执行
finally
{
System.out.println("finally block"); //3
}
最后才执行的主函数System.out.println(“!返回值!"after return"”);
作者:
ila123
时间:
2011-9-27 09:54
[code=java]public class TryFinally {
public static void main(String[] args) {
System.out.println(test());//1、先执行
test();//改成这样他就没有最后的after return了
}
public static String test() {
try {
System.out.println("try block");//1.1
return test1();//1.2
} finally {
System.out.println("finally block");//1.3
}
}
public static String test1() {
System.out.println("return statement");//1.2.1
return "after return";//1.2.2其实这个是返回给1的,就是说是test()的最终返回结果。
}
}[/code]
[
本帖最后由 ila123 于 2011-09-27 09:57 编辑
]
作者:
匿名
时间:
2011-9-27 10:57
因为在这个代码中,如前面2位所说的,在运行 test()会返回“after return”,但是返回时 test()方法的finally语句并还没运行完,所以便先运行finally语句还接着执行调用test()方法的语句
作者:
匿名
时间:
2011-9-27 12:18
我说下我的看法。
当方法运行完毕后,方法的栈内存会被销毁,方法里的内容就不会被再次执行,因为只要方法一返回,方法就会释放其所占用的 cpu资源,线程回到主调函数的执行,该方法被销毁。方法被销毁后,还怎么能占用cpu资源,执行自己的代码呢?
所以,只能是:finally语句块是再方法返回 前被执行的。就是 方法 把它 的返回值往外抛之前执行。就像异常里的throw一样,必须在抛出异常前执行finally语句块。
看下面简单代码:
int a = m(); int m(){try{ return 1;}catch(Exception e){}finally{System.out.println("111");}
就是finally语句块里的输出语句会在虚拟机给 a 赋值前执行。
作者:
许晨峰
时间:
2011-9-27 14:40
楼主的问题:为什么finally block会在after return之前出现呢?
答:先赞楼主一个,问得好。在使用try catch的时候,finally中的语句块是无论如何也要执行的,那么就涉及到return的语句该怎么办呢?return返回值总是在最后执行的,那么return语句在finally语句之前呢?按照jvm运行的流程是这样的:如果碰到上面的情况,是要先执行finally,执行完后再进行return。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2