黑马程序员技术交流社区

标题: 返回结果为什么是2 [打印本页]

作者: 青木郎    时间: 2014-3-20 21:15
标题: 返回结果为什么是2
本帖最后由 青木郎 于 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,不理解啊

作者: 上官睿鹏    时间: 2014-3-20 21:26
因为finnally语句块在程序中最后始终要执行的,执行完finnally后返回值就是2了
作者: 乔钰博    时间: 2014-3-20 21:36
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的返回值
作者: papercup    时间: 2014-3-20 21:42
finally语句是在捕获异常的时候try{}catch{}语句后一定要执行到的。你的程序try{}的时候捕获了异常,然后执行了finally语句。所以打印的结果自然是 2 啦。
作者: 青木郎    时间: 2014-3-20 21:50
乔钰博 发表于 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:57
青木郎 发表于 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返回。
作者: SyouRai_Tsk    时间: 2014-3-20 22:01
try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally
}
作者: syw02014    时间: 2014-3-20 22:04
碰到try语句中的return时,return首先被执行,finally后被执行,return并不是让结果马上返回,而是先把结果放到函数中,然后必须等待finally结果出来后在真正的返回,此时返回的结果就是finally当中的那个结果。
作者: Ranger    时间: 2014-3-20 22:19
finally里的语句必须执行,所以返回了2
作者: 小武8686886    时间: 2014-3-20 22:25

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;
                                }
        }
}




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