Java中try、catch、finally的执行顺序

下面这个问题是我遇到的,当我在try中加了个return,我发现finally的执行会有点不太一样,所以找到了下面这篇文章,总结的不错,转载过来。

对于try{}catch{}finally{}而言,它们的执行顺序很简单,如果在try{}中捕获相应的异常,中断当前代码的执行,转而去执行catch{}中的内容,最后去执行finally{}中方法,一般来说finally中的方法都是会被执行的,其中finally中很大程度上用于资源的释放。

下面讲解一些我们java程序员需要注意的地方:

(1)finally中的代码总是会执行的吗?

不是,如果一个方法内在执行try{}语句之前就已经return了,那么finally语句指定不会执行了。因为它根本没有进入try语句中,如果在一个try语句中调用System.exit(0);方法,那么就会退出当前Java虚拟机,那么finally也就没有执行的机会了。

(2)finally在return之前执行还是在return之后执行?

很多人可能会说在return执行之前执行。我的答案是在return中间执行,是不是很特别,请按下面的例子:

class Test {
  public static void main(String[] args) {
    System.out.println(method());
  }

  public static int method() {
    int x = 1;
    try {
      return x;
    } catch (Exception e) {
      return 0;
    } finally {
      ++x;
    }
  }
}

请问输出的结果会是多少呢?

正确答案是:1

下面我来讲解一下这个程序的执行过程,首先程序在执行到try{}语句中的return方法后,就会先返回相应的值,并把相应的值存储在一个临时栈中去保存这个结果。这时临时栈中存储的值为1。但是程序不会立刻返回,转而回去执行finally中的方法,++x,在finally执行完后,方法全部执行完,这时会再次调用return方法,注意这时不在是返回值,而是告诉主调程序,被调程序已经执行完了,你可以接着去执行你主程序的其它方法了。但是请注意,此时返回的值还是原来保存在临时栈中的值1。

为了更好的理解这个问题,我们看下面的程序:

class Test {
  public static void main(String[] args) {
    System.out.println(method());
  }

  public static int method() {
    try {
      return 1;
    } catch (Exception e) {
      return 0;
    } finally {
      return 2;
    }
  }
}

这时的正确答案又是什么呢?

答案是2,这里仅仅需要注意的是在try{}语句中执行到return 1会在临时栈中存储值为1的变量。接着回去执行finally里面的内容,这时执行finally中的return 2;方法,这时临时栈中的值就是变为 2,会覆盖原来临时栈中的值1.所以它的返回值为2。

(3)finally方法是必须的吗?
不是,开发者可以根据自身的情况去决定是否使用finally关键字。

参考资料:

本文标题:Java中try、catch、finally的执行顺序

本文链接:http://yedward.net/?id=222

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章