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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 谢毅 于 2013-1-19 12:57 编辑

public  class Test {

        /**
         * @param args add by zxx ,Dec 9, 2008
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(new Test().test());;
        }

        static int test()
        {
                int x = 1;
                try
                {
                        return x;
                }
                finally
                {
                        ++x;
                }
        }
        
}
为什么结果是1

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
本帖最后由 梁俊 于 2013-1-18 22:40 编辑

try中的return语句调用的函数先与finally中调用的函数,也就是说return语句先执行finally语句后执行,所以返回的结果是1。
return并不是让函数马上返回,而是return语句执行后,将把返回结果放置静函数栈中,此时函数并不是马上返回,它要执行
finally语句后才真正开始返回。

可以从以下程序看出来
  1. public  class Test {
  2.      public static void main(String[] args) {
  3.           System.out.println(new Test().test());;
  4.      }
  5.      int test()
  6.      {
  7.           try
  8.           {
  9.               return func1();
  10.           }
  11.           finally
  12.           {
  13.               return func2();
  14.           }
  15.      }
  16.      int func1()
  17.      {
  18.           System.out.println("func1");
  19.           return 1;
  20.      }
  21.      int func2()
  22.      {
  23.           System.out.println("func2");
  24.           return 2;
  25.      }   
  26. }
复制代码
-----------执行结果-----------------
func1

func2

2

结论:finally中的代码比return 和break语句后执行

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马唐贤来 于 2013-1-18 23:05 编辑

同学,那肯定是1了,
  1. static int test()
  2.         {
  3.                 int x = 1;
  4.                 try                                          {
  5.                         return x;                          //先return,才会执行finally
  6.                 }
  7.                 finally
  8.                 {
  9.                         ++x;
  10.                         System.out.println(x);               //这里才是2
  11.                 }
复制代码

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
不执行finally的语句只有一条,那就是java.exit(0);其他的全部要执行的。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
二楼的哥们,return在try...catch...finally语句中是跳不出来的,依旧会执行finally里面的语句的。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
3楼正解                        
回复 使用道具 举报
一、如果try catch finally块均无return则执行最后finally外的return;
如果try catch finally中任何一个有return则最后finally外的return不再执行;

二、只要finally块中有return则try或catch中的return不再执行.
总结:任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. public  class Test {

  2.         /**
  3.          * @param args add by zxx ,Dec 9, 2008
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 System.out.println(new Test().test());;
  8.         }

  9.         static int test()
  10.         {
  11.                 int x = 1;
  12.                 try
  13.                 {
  14.                         return x;//这里才是return回去的值.所以是1
  15.                 }
  16.                 finally
  17.                 {
  18.                         ++x;//这里是一定执行的x=2了..但是没return
  19.                 }
  20.         }
  21.         
  22. }
  23. 为什么结果是1

复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 柴乔军 于 2013-1-19 14:13 编辑

虽然,finally内的代码会在return之前执行,但是finally内的代码不能修改return 返回的值
回复 使用道具 举报
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                
  4.                 //调用测试方法
  5.                 int i = test();
  6.                 //输出i的结果,证明在finally中是否被修改
  7.                 System.out.println(i);
  8.         }
  9.        
  10.         public static int test() {
  11.                
  12.                 //定义一个变量
  13.                 int i = 123;
  14.                
  15.                 try {
  16.                         //表示try内的代码被执行
  17.                         System.out.println("--------try---------");
  18.                
  19.                         //返回i的值
  20.                         return i;
  21.                        
  22.                 } finally {
  23.                         //对i进行重新赋值
  24.                         i = 222;
  25.                        
  26.                         //表示finally块中的代码被执行
  27.                         System.out.println("---------finally--------");
  28.                 }
  29.                
  30.         }
  31.        
  32. }
复制代码
结果:
--------try---------
---------finally--------
123

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 很给力! 建议以后抢先回答,原则上有三个正.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马