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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 疯狂程序 中级黑马   /  2013-3-20 11:31  /  2276 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 疯狂程序 于 2013-3-21 10:53 编辑

try{}里有一个return语句,那么紧跟在这个try后的finally{}里德code会不会被执行,什么时候被执行,在return前还是后?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

9 个回复

倒序浏览
会执行的,无论try里面是什么代码,finally代码块中的代码都会执行,是在return之后执行的,你可以看看这个版块相关的帖子,有相关的问题。但愿对你有帮助。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
肯定会执行了,是在return前执行吧,楼上,
回复 使用道具 举报
本帖最后由 汪平乐 于 2013-3-20 12:27 编辑

  1. <P>用main线程说明:
  2. public static void main (String[] args)
  3. {

  4.     try {
  5.             // code 会执行的代码,有异常的话就catch,catch的code执行后再向下执行return语句。没有异常的话就直接执行return语句
  6.             //return 1; 返回方法指定类型的值(这个值总是确定的)</P>
  7. <P>            return; //结束方法的执行(仅仅一个return语句)

  8.         }
  9.     catch(Exception e){
  10.                 //code ,由try中的code决定会不会执行
  11.         }
  12.     finally{
  13.                 //code  JVM一定会执行的代码
  14.         }
  15. }</P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
可以看下下面的代码的,finally中的代码一定会被执行的,是在return语句之前执行的,但是如果try中有这行代码的System.exit(0);finally中的语句是不会北执行的,因为这是系统,退出。jvm结束。表示程序运行结束,先这样运行试试,然后把除数改为负数运行在试试,看看效果的

class Demo
{
     int div(int a,int b)//throws RuntimeException 因为ArithmeticException
是RuntimeException所以可以不声明
{
    if(b<0)
       throw new ArithmeticException("除数为负数");//ArithmeticException异常是说当除数为附属的时候发生异常
   return a/b;
   }
}

class  ExceptionDemo
{
public static void main(String[] args)
{
  Demo d = new Demo();

  try
  {
   int x = d.div(4,1);//将1改为负数看看的
   System.out.println("x="+x);

  }
  catch (ArithmeticException e)
  {
   System.out.println(e.toString());
   return;
   //System.exit(0);//系统,退出。jvm结束。
  }
  finally
  {
   System.out.println("finally");//finally中存放的是一定会被执行的代

码。
  }
  System.out.println("over");
}
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
finally中存放的代码是一定会执行的, finally中定义的通常是关闭资源的代码,finally只有一种情况不会执行当程序执行到System.exit(0)系统直接退出,
按流程:
try
{
        要执行的代码;//如果这里发生异常流程转到Catch
        return;//若没有异常程序自动转入finally
               
}
catch ()   //这里处理完捕捉到的异常流程进入下面finally
{
}
finally
{
通常是关闭资源代码;
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
楼上正解,补充一点,finally中的代码会先于try和catch中的return执行,也就是当前面遇到return的时候,系统会自动去执行以下finally,然后返回return的值,但是如果finally中也包含了return,则会让try和catch中的return失效,这时候返回的就是finally中的return值了。
回复 使用道具 举报
郝强勇 发表于 2013-3-20 11:50
会执行的,无论try里面是什么代码,finally代码块中的代码都会执行,是在return之后执行的,你可以看看这个 ...

finally是在return之前执行。
回复 使用道具 举报
罗威 中级黑马 2013-3-20 14:12:53
9#
其实准确的说应该是在return中间执行的,下面是演示代码
public class Test {
        public static void main(String[] args) {
                System.out.println(getNumber());
        }

        public static int getNumber() {
                int x = 10;
                try {
                        System.out.println(10 / 0);
                } catch (Exception e) {
                        x = 20;
                        return x;  //return 20;
                } finally {
                        x=30;
                        System.out.println("hello");
                }
                return 0;
        }
}

这个你可 以利用eclipse高级工具,搞个断点进入调试界面,你就会发现x=20的值已经赋给了retrun x,但是并没有让程序结束,因为他看到后面还有finally,他就去走finally的执行语句了,finally中有个x=30,但是之后走完finally之后,而你可以发现输出的结果仍然是20,而不是30 ,finally中的x=30,30这个值并没有赋给  x 输出,所以结论就很明显了!这个也是张孝祥老师面试题里面整理的一道题,有时间你也可以去看看这些题目,收获会很大的

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问;没有的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马