黑马程序员技术交流社区

标题: 关于异常try [打印本页]

作者: 疯狂程序    时间: 2013-3-20 11:31
标题: 关于异常try
本帖最后由 疯狂程序 于 2013-3-21 10:53 编辑

try{}里有一个return语句,那么紧跟在这个try后的finally{}里德code会不会被执行,什么时候被执行,在return前还是后?
作者: 郝强勇    时间: 2013-3-20 11:50
会执行的,无论try里面是什么代码,finally代码块中的代码都会执行,是在return之后执行的,你可以看看这个版块相关的帖子,有相关的问题。但愿对你有帮助。
作者: 牛合超    时间: 2013-3-20 11:52
肯定会执行了,是在return前执行吧,楼上,
作者: 汪平乐    时间: 2013-3-20 12:24
本帖最后由 汪平乐 于 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>
复制代码

作者: Just_Only    时间: 2013-3-20 12:29
可以看下下面的代码的,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");
}
}


作者: 全超    时间: 2013-3-20 13:25
finally中存放的代码是一定会执行的, finally中定义的通常是关闭资源的代码,finally只有一种情况不会执行当程序执行到System.exit(0)系统直接退出,
按流程:
try
{
        要执行的代码;//如果这里发生异常流程转到Catch
        return;//若没有异常程序自动转入finally
               
}
catch ()   //这里处理完捕捉到的异常流程进入下面finally
{
}
finally
{
通常是关闭资源代码;
}
作者: VOIDMAIN    时间: 2013-3-20 13:51
楼上正解,补充一点,finally中的代码会先于try和catch中的return执行,也就是当前面遇到return的时候,系统会自动去执行以下finally,然后返回return的值,但是如果finally中也包含了return,则会让try和catch中的return失效,这时候返回的就是finally中的return值了。
作者: VOIDMAIN    时间: 2013-3-20 13:52
郝强勇 发表于 2013-3-20 11:50
会执行的,无论try里面是什么代码,finally代码块中的代码都会执行,是在return之后执行的,你可以看看这个 ...

finally是在return之前执行。
作者: 罗威    时间: 2013-3-20 14:12
其实准确的说应该是在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 输出,所以结论就很明显了!这个也是张孝祥老师面试题里面整理的一道题,有时间你也可以去看看这些题目,收获会很大的
作者: 陈丽莉    时间: 2013-3-20 15:39
若还有问题,请继续追问;没有的话,请将帖子分类改成【已解决】~




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