黑马程序员技术交流社区

标题: 关于异常的问题 [打印本页]

作者: 黄树人    时间: 2012-9-22 19:16
标题: 关于异常的问题
本帖最后由 黄树人 于 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语句吗?
作者: 宁振庄    时间: 2012-9-22 19:27
网上高人解释: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. }
复制代码

作者: 梁志冰    时间: 2012-9-22 19:42
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值)




作者: 陈琦    时间: 2012-9-22 23:32
受教了,一直不明白这个问题




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2