黑马程序员技术交流社区

标题: return 和finally的问题 [打印本页]

作者: 刘云龙    时间: 2013-3-19 00:49
标题: return 和finally的问题
本帖最后由 刘云龙 于 2013-3-19 20:09 编辑

class  Indecision
{
public static void main(String[] args)
{
  System.out.println(decision());
}
public static boolean decision()
{
  try
  {
   return true;
  }
  finally
  {
   return false;
  }
}
}
大家看看这个,return 和finally的问题,结果是false,该怎么解释?
一般理解是,fiallyl里的代码会在return之前执行,
但是这里,好像是在return true;之后执行的?
作者: 蒋太原    时间: 2013-3-19 00:56
首先,你的try{}不跟catch{}一对,finally{}是不管程序有没有抛出异常都会执行,这是程序的出口。
作者: 张雪萍    时间: 2013-3-19 00:59
finally代码块:定义一定执行的的代码
通常用于关闭资源
finally只有一种情况不会执行,当执行到System.exit(0);时
finally不会执行。
try里边的return执行后,程序并没有结束,因为finally内的代码是一定会执行的,所以最后结果是返回false。
作者: 寇弘禄    时间: 2013-3-19 10:13
在执行try中的return语句之前会先执行finally中的语句,当执行完finally中的return false之后程序就结束了,所以没有执行try中的return true语句。
作者: 李阳阳    时间: 2013-3-19 10:38
对于程序中可能发生的异常,可以将其添加到try...finally语句块中,这样当程序发生异常时,
就可以在finally中对其进行相应的处理。另外当程序没有发生异常时,执行完try和finally之间
的语句后,也将执行finally语句块中的代码,因此可以在finally语句块中放置一些必须执行的
代码,如释放内存资源的代码。像关闭数据库连接,关闭IO流等
try...finally语句块的语法格式如下:
try
{
        需要执行的语句;
}
finally
{
     一定会被处理的语句;
}

作者: scott0610    时间: 2013-3-19 12:05
本帖最后由 袁见 于 2013-3-19 12:07 编辑

为了让你更好的理解可以通过下面一个例子程序来帮助我解释这个答案,
从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,
所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,
此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

public  class Test {
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(new Test().test());;
        }

        int test()
        {
                try
                {
                        return func1();
                }
                finally
                {
                        return func2();
                }
        }
        
        int func1()
        {
                System.out.println("func1");
                return 1;
        }
        int func2()
        {
                System.out.println("func2");
                return 2;
        }        
}
-----------执行结果-----------------
func1
func2
2

希望对你有所帮助!
作者: _王涛    时间: 2013-3-19 13:49
这个问题其实不难理解,根据以下代码做出分析:
  1. public class Test02 {

  2. public static void main(String[] args) {

  3. System.out.println(sop());
  4. }

  5. public static boolean sop(){

  6. try{
  7. System.out.println("ok");
  8. return true;
  9. }
  10. finally{
  11. return false;
  12. }
  13. }

  14. }

复制代码
结果----------->ok
                   false
结果之所以是ok , false,因为在try{}跟finally{}组合时无论管程序有没有抛出异常都会执行finally{}中的代码,也可以说这是程序的出口,也叫必经之路,所以会输出false。由于结果同时输出了ok,证明程序也执行了try{}块中的代码,因此此时肯定会返回true,而结果却是false,这是为什么呢?其实即使他返回了true但是程序无论如何都必须去执行finally{}快中的代码,这样一来,到程序运行到最后只能返回一个唯一的boolean值那就只能是false了。此时答案就一目了然了。

希望对楼主有所帮助!!加油兄弟


作者: 寇弘禄    时间: 2013-3-19 18:28
袁见 发表于 2013-3-19 12:05
为了让你更好的理解可以通过下面一个例子程序来帮助我解释这个答案,
从下面例子的运行结果中可以发现,try ...

学习了,看来是我理解错了。。
作者: 刘云龙    时间: 2013-3-19 20:11
张雪萍 发表于 2013-3-19 00:59
finally代码块:定义一定执行的的代码
通常用于关闭资源
finally只有一种情况不会执行,当执行到System.exi ...

嗯 ,谢谢,你的意思是它会跳过,try里面的return 而执行finally里面的return?
作者: 张雪萍    时间: 2013-3-19 21:06
刘云龙 发表于 2013-3-19 20:11
嗯 ,谢谢,你的意思是它会跳过,try里面的return 而执行finally里面的return?

不是跳过,也执行,但是结果只能返回一个值,程序执行到try时还没有结束,继续执行finally内搭代码,举个例子:就是你的手里只能拿一样东西,我中午给你了一个苹果,晚上又给你一个橘子,我要统计你这一天结束之后你的手里最后剩下什么。
就是这么个例子,一个程序只能有一个返回结果。希望能帮助你




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