A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄树人 中级黑马   /  2012-9-22 19:16  /  1538 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄树人 于 2012-9-22 19:55 编辑
  1. package haha;

  2. public class VariantTest {

  3.         public static void main(String[] args) {

  4.                 System.out.println(new VariantTest().test());
  5.                 ;

  6.         }

  7.         static int test()

  8.         {

  9.                 int x = 1;

  10.                 try

  11.                 {

  12.                         return x;

  13.                 }

  14.                 finally

  15.                 {

  16.                         ++x;

  17.                 }

  18.         }

  19. }
复制代码
程序的输出结果为1,在异常中finally中的代码是一定会被执行的,我觉得输出结果应该是2
可是上面的程序,主方法调用了test方法,test是个异常处理方法
当执行完try语句后就直接把值返回了,可以认为是没有执行finally语句吗?

3 个回复

倒序浏览
网上高人解释:JVM解析的时候先将return回的值存在一个临时的空间中,然后执行finally,方法结束的时候再把原先临时空间的值取出来。
  1. package haha;

  2. public class VariantTest {

  3.         public static void main(String[] args) {

  4.                 System.out.println(new VariantTest().test());
  5.                 ;

  6.         }

  7.         static int test()

  8.         {

  9.                 int x = 1;

  10.                 try

  11.                 {

  12.                         return x;  //这一步将x的值,也就是1放到某个临时空间中

  13.                 }

  14.                 finally

  15.                 {

  16.                         ++x;     //这一步还是会执行的,这时候x值为2

  17.                 }

  18.         }//方法结束的时候从原先临时空间把值取出来,所以x的值又变回了1

  19. }
复制代码
回复 使用道具 举报
class VariantTest {
        public static void main(String[] args) {
    System.out.println("main...."+new VariantTest().test());  
        }
       static int test()
        {
               int x = 1;
                try
               {
     return x;
                }
                finally
                {
                        ++x;
    System.out.println("finally....."+x);
                }
        }
}
运行结果:
finally.....2
main....1

将小程序进行如上的小改动,在finally中添加小小的打印程序,我们就可以从输出结果中清晰的看到,其实finally语句已经执行了,而且在主函数的println语句前执行。
在调用test()方法的时候,返回了x的值给主函数。而finally中的++x,是在对象中的x自增1,并没有返回给主函数,所以主函数输出的结果为1(即try中return的x值)



回复 使用道具 举报
受教了,一直不明白这个问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马