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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chuanyueing 中级黑马   /  2013-3-6 16:38  /  1661 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家说这个程序的结果会输出什么?开始我认为输出为7,可是实际输出为2,但是经过调试,在程序返回前是要经过k += 5 这段代码的,并且通过观察点k的值是7,但是真正的输出却是2,这是为什么?
  1. package com;

  2. public class TestTryCatch
  3. {
  4.         public static void main(String args[])
  5.         {

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

  8.         public static int kkk()
  9.         {
  10.                 int k = 0;
  11.                 try
  12.                 {       
  13.                         k += 2;
  14.                         return k;
  15.                 } catch(Exception e)
  16.                 {       
  17.                         k++;
  18.                         return k;
  19.                 } finally
  20.                 {
  21.                         k += 5;       
  22.                 }
  23.         }
  24. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

7 个回复

倒序浏览
return是在finally执行后才返回的,且在finally无法改变返回值。所以你所返回的就是2了
看下面这个程序你就明白了
  1. public class Test5{
  2.                
  3.                 //主函数
  4.         public static void main(String[] args) {
  5.                 //定义一个整型数组
  6.                 int [] arr={1,23,8,14,55};
  7.                //调用showElement方法并传递一个大可以导致越界的参数
  8.                int res=showElement(arr,arr.length);
  9.                //显示得到的返回值
  10.                System.out.println(res);
  11.         }

  12.         public static int showElement(int[] arr, int length) {
  13.                int num=1;
  14.                 try {
  15.                        System.out.println(arr[length]);
  16.                
  17.                }
  18.                catch (Exception e) {//这里应该抛数组角标越界,这里简单处理
  19.                         return num;//返回num
  20.                         
  21.               }
  22.              finally{
  23.                      num=2;
  24.                        System.out.println("finally执行了!");
  25.                        
  26.               }
  27.                 return 3;
  28.                
  29.        }
  30.       
  31. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
我把程序修改一下,你就会看的明白了。
public class TestTryCatch
{
        public static void main(String args[])
        {
                                int t = 0;
                                int a = kkk(t);
                System.out.println(a);
        }
        public static int kkk(int k)
        {
               // int k = 0;这是个局部变量

             try
                {        
                        k += 2;//无论K怎么变都不对t有影响。因为K只是t的复制品。
             System.out.println(k);
                        return k;//把局部变量返给a

                }
        catch(Exception e)
                {        
                        k++;       
                        return k;
                }
        finally
                {
                        k += 5;//此时K的值时7,但是它是局部变量,没有返回给a。所以打印a会显示的是2.
              System.out.println(k);
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
因为本程序没有异常
所以不会执行,catch代码块中的内容
try语句块中的内容执行以后,肯定要执行finally语句块,
只有在一种情况下不执行,finally语句块中的内容,就是强行停止程序,遇到System.exit(0);
执行完finally语句块中的内容以后,才会return,也就是说
finally中的内容,是在return之前执行的
那么为什么还是会返回2 呢?
原因是在finally中无法改变返回值。

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
李阳 发表于 2013-3-6 17:04
我把程序修改一下,你就会看的明白了。
public class TestTryCatch
{

谢谢,很有帮助
回复 使用道具 举报
韩松范 发表于 2013-3-6 17:14
因为本程序没有异常
所以不会执行,catch代码块中的内容
try语句块中的内容执行以后,肯定要执行finally语 ...

谢谢,很有帮助
回复 使用道具 举报
罗正荣 发表于 2013-3-6 16:55
return是在finally执行后才返回的,且在finally无法改变返回值。所以你所返回的就是2了
看下面这个程序你就 ...

谢谢了:)
回复 使用道具 举报
额  这个知识点我也不知道啊  学习了  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马