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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘云龙 中级黑马   /  2013-3-19 00:49  /  2157 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘云龙 于 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 01:05

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

9 个回复

倒序浏览
首先,你的try{}不跟catch{}一对,finally{}是不管程序有没有抛出异常都会执行,这是程序的出口。
回复 使用道具 举报
finally代码块:定义一定执行的的代码
通常用于关闭资源
finally只有一种情况不会执行,当执行到System.exit(0);时
finally不会执行。
try里边的return执行后,程序并没有结束,因为finally内的代码是一定会执行的,所以最后结果是返回false。

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
在执行try中的return语句之前会先执行finally中的语句,当执行完finally中的return false之后程序就结束了,所以没有执行try中的return true语句。
回复 使用道具 举报
对于程序中可能发生的异常,可以将其添加到try...finally语句块中,这样当程序发生异常时,
就可以在finally中对其进行相应的处理。另外当程序没有发生异常时,执行完try和finally之间
的语句后,也将执行finally语句块中的代码,因此可以在finally语句块中放置一些必须执行的
代码,如释放内存资源的代码。像关闭数据库连接,关闭IO流等
try...finally语句块的语法格式如下:
try
{
        需要执行的语句;
}
finally
{
     一定会被处理的语句;
}

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 袁见 于 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

希望对你有所帮助!

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
这个问题其实不难理解,根据以下代码做出分析:
  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 12:05
为了让你更好的理解可以通过下面一个例子程序来帮助我解释这个答案,
从下面例子的运行结果中可以发现,try ...

学习了,看来是我理解错了。。
回复 使用道具 举报
张雪萍 发表于 2013-3-19 00:59
finally代码块:定义一定执行的的代码
通常用于关闭资源
finally只有一种情况不会执行,当执行到System.exi ...

嗯 ,谢谢,你的意思是它会跳过,try里面的return 而执行finally里面的return?
回复 使用道具 举报
刘云龙 发表于 2013-3-19 20:11
嗯 ,谢谢,你的意思是它会跳过,try里面的return 而执行finally里面的return?

不是跳过,也执行,但是结果只能返回一个值,程序执行到try时还没有结束,继续执行finally内搭代码,举个例子:就是你的手里只能拿一样东西,我中午给你了一个苹果,晚上又给你一个橘子,我要统计你这一天结束之后你的手里最后剩下什么。
就是这么个例子,一个程序只能有一个返回结果。希望能帮助你
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马