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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 青木郎 中级黑马   /  2014-3-20 21:15  /  1423 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 青木郎 于 2014-3-20 22:26 编辑

class TryTest
{
        public static void main(String[] args)
        {
                Test t = new Test();
                int b = t.get();
                System.out.println(b);
        }
        public int get()
        {
                try
                {
                        return 1;
                }
                finally
                {
                        return 2;
                }
        }
}
为什么结果是2,不理解啊

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

9 个回复

倒序浏览
因为finnally语句块在程序中最后始终要执行的,执行完finnally后返回值就是2了
回复 使用道具 举报
try finally执行是这样的先执行catch里面的内容,如果catch内有返回值则将catch内的返回值放入一个临时区域,finally是总是要执行的,如果finally有返回值就将finally的返回值替换掉临时区域内的内容然后将临时区域的内容返回。
  1.         public static void main(String[] args) {
  2.                 int i = 0;
  3.                 System.out.println(method1(i));
  4.                
  5.         }
  6.        
  7.         public static int method1(int i){
  8.                
  9.                 try{
  10.                         System.out.println("try " + i);
  11.                         return method2(i);
  12.                 }
  13.                 finally{
  14.                         System.out.println("finally " + i);
  15.                 }
  16.         }
  17.        
  18.         public static int method2(int i){
  19.                 i=i+1;
  20.                 System.out.println("method2执行" + i);
  21.                 return i;
  22.         }
复制代码

执行结果为:
try 0
method2执行1
finally 0
1

如果finally区域没有返回值则就返回catch的返回值

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
finally语句是在捕获异常的时候try{}catch{}语句后一定要执行到的。你的程序try{}的时候捕获了异常,然后执行了finally语句。所以打印的结果自然是 2 啦。
回复 使用道具 举报
乔钰博 发表于 2014-3-20 21:36
try finally执行是这样的先执行catch里面的内容,如果catch内有返回值则将catch内的返回值放入一个临时区域 ...

我用了你的代码更糊涂了,我在你的finally语句中加入了return语句,

class TryTest
{
          public static void main(String[] args) {
                int i = 0;
                System.out.println(method1(i));
               
        }
        
        public static int method1(int i){
               
                try{
                        System.out.println("try " + i);
                        return method2(i);
                }
                finally{
                        System.out.println("finally " + i);
                                                return i;
                }
        }
        
        public static int method2(int i){
                i=i+1;
                System.out.println("method2执行" + i);
                return i;
        }
}
怎么结果却是
try 0
method2执行1
finally 0
0
最后输出0,什么情况
回复 使用道具 举报
青木郎 发表于 2014-3-20 21:50
我用了你的代码更糊涂了,我在你的finally语句中加入了return语句,

class TryTest
  1.         public static void main(String[] args) {
  2.                 int i = 0;
  3.                 System.out.println(method1(i));
  4.                
  5.         }
  6.        
  7.         public static int method1(int i){
  8.                
  9.                 try{
  10.                        
  11.                         return i;
  12.                 }
  13.                 finally{
  14.                         i++;
  15.                         System.out.println(i);
  16.                         //return i;
  17.                 }
  18.         }
复制代码

这段代码输出是
1
0
因为try里面的return并没有立刻返回,而是把i=0这个值存在一个临时区域,然后执行finally的i++,虽然i变成1了,但是返回的还是临时区域里的0,但是如果把finally里面注释的return i打开,则执行finallyi++之后监测到return语句,则将i=1替换掉临时区域的i=0,然后将i=1返回。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报 2 0
try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
碰到try语句中的return时,return首先被执行,finally后被执行,return并不是让结果马上返回,而是先把结果放到函数中,然后必须等待finally结果出来后在真正的返回,此时返回的结果就是finally当中的那个结果。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
Ranger 中级黑马 2014-3-20 22:19:56
9#
finally里的语句必须执行,所以返回了2
回复 使用道具 举报

class TryTest
{
        public static void main(String[] args)
        {
                Test t = new Test();
                int b = t.get();
                System.out.println(b);
        }
      
}
class Test
{
          public int get()
        {
                  /*     try
                {
                        return 1;
                }
                finally
                {
                        return 2;
                }
                                */
//           
                                try
                                {
                                        //代码区

                                        return  1;

                                }
                                catch (Exception e)
                                {
                                        //异常区
                                       
                                        return 2;
                                }
                           //代码区如果有错误,就会返回所写异常的处理。
                //可以在Catch部分加上一句System.out.println(e.ToString());
                        //如果出现异常可以把异常打印出来



                                finally
                        {
                                 return  23;
                                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

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