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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周朋飞 中级黑马   /  2012-6-28 14:00  /  2766 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package testDemo;

public class TestTryCatch {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

                System.out.println(kkk());
        }

        public static int kkk() {
                int k = 0;
                try {
                        k += 2;
                        return k;
                } catch (Exception e) {
                        k++;
                        return k;
                } finally {
                        k += 5;
                       
                }
        }

}
我明明看到debug的时候k 的值是7 可为什么返回的是2 呢

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!这是个问题

查看全部评分

11 个回复

倒序浏览
try块没有抛出异常,当执行k += 2;之后就会执行return k; 此时计算出了k的值为2,再执行finally块中代码,但不会影响要返回的值。
同样 如果try块中是return k+1; 那么结果是3

点评

如果catch中在return前发生异常了呢,比如?/0这种的,会发生什么事情?呵呵  发表于 2012-6-28 14:20
回复 使用道具 举报
对于函数来说,返回值指在return语句执行时返回的值,finally语句是在return之后执行的,所以,并不会影响返回值,如果想达到要求,应该在finally里使用finally里返回。
对于完整的try catch finally来说,try中的语句应该尽量保证其正确性,而catch中应该是进行修正,而非简单的抛异常堆栈,而对于返回值要求严格的函数来说,你应该在finally里进行返回,而不是catch里边。

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
我明明看到debug的时候k 的值是7 可为什么返回的是2 呢 //因为finally里面执行完后k=7但是没有返回,如果在finally里面再加上return k,则输出结果会为7
回复 使用道具 举报
如果你在finally里面用return k;的话,那么调用后返回的值就是7了。
回复 使用道具 举报
因为你的finally里面没有return 所以return的是2
回复 使用道具 举报
吴扬 中级黑马 2012-6-28 14:20:08
7#
try语句块中执行k += 2;这个语句之后k的值为2,然后就直接被return语句返回给了主函数,所以主函数接收到的返回值当然是2了。
回复 使用道具 举报
返回值会存起来..
你要是这样写就返回7了..


package testDemo;

public class TestTryCatch {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

                System.out.println(kkk());
        }

        public static int kkk() {
                int k = 0;
                try {
                        k += 2;
                        return k;
                } catch (Exception e) {
                        k++;
                        return k;
                } finally {
                        k += 5;
                        return k;
                }
        }
}
要是后边又出现return就会覆盖前边储存起来的的值..

评分

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

查看全部评分

回复 使用道具 举报
赵庆礼 发表于 2012-6-28 14:07
try块没有抛出异常,当执行k += 2;之后就会执行return k; 此时计算出了k的值为2,再执行finally块中代码, ...

如果catch中发生异常,将不会返回任何值,控制台上会抛出异常,但是finally中的语句还是会执行的
回复 使用道具 举报
楼主,其实就是这个程序没有出现异常,所以直接执行了try里面的内容,try里面的语句执行后return了k的值,

finally里面的语句是执行了,但是没有返回K的值,所以打印的结果还是try里面返回的k的值,你想结果改变为7就在finally语句加上return,这样就把K的值改变了.

评分

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

查看全部评分

回复 使用道具 举报
return返回的结果将放置进函数栈中,此函数并不是马上返回,他要执行finally语句后才真正开始返回
回复 使用道具 举报
这个问题在张孝祥老师的java面试宝典里有介绍,下面有一个他写的程序可以说明这个问题
  1. public class FinallyTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 FinallyTest ft=new FinallyTest();
  6. //                System.out.println(ft.get());
  7.                 System.out.println(ft.test());
  8.         }
  9.        
  10.         public static int get()
  11.         {
  12.                 try
  13.                 {
  14.                         return 1;
  15.                 }
  16.                 finally
  17.                 {
  18.                         return 2;
  19.                 }
  20.         }
  21.         int test()
  22.         {
  23.                 try
  24.                 {
  25.                         return func1();
  26.                 }
  27.                 finally
  28.                 {
  29.                         return func2();
  30.                 }
  31.         }
  32.         int func1()
  33.         {
  34.                 System.out.println("func1");
  35.                 return 1;
  36.         }
  37.         int func2()
  38.         {
  39.                 System.out.println("func2");
  40.                 return 2;
  41.         }
  42.        
  43. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马