疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

finally语句块的执行


 

  一、finally语句块是否一定执行?

  Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过试验验,至少以下有两种情况下finally语句是不会被执行的:

  (1)、异常捕获机制finally块与try和catch块是关联的,既然是关联的如果try...catch...finally语句逻辑上达不到没有被执行,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try...catch...finally语句一定被执行到。

  (2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所以都结束了,当然finally语句也不会被执行到。

  二、finally语句块是否一定会执行,遇到return怎么办?

  public class FinallyTest1 {

  public void test(){

  try{

  System.out.println("Try statement block……");

  return ;

  }catch(Exception e){

  System.out.println("Exception statement block……");

  }finally{

  System.out.println("在try语句块中return你再强大,也影响不了我finally语句块的继续执行,嘿嘿……");

  }

  }

  public static void main(String[] args) {

  FinallyTest1 t=new FinallyTest1();

  t.test();

  }

  }

  /*

  运行结果:

  Try statement block……

  在try语句块中return你再强大,也影响不了我finally语句块的继续执行,嘿嘿……

  总结:

  finally语句块的执行不会受到try语句块中的return的影响。

  */

  三、finally语句块不受return语句的影响,哪finally语句块到底是在return之前还是之后执行?

  public class FinallyTest2 {

  private int test(){

  int a=520;

  try{

  return a+=1314000;

  }catch(Exception e){

  System.out.println();

  }finally{

  System.out.println("Finally执行,a值为:"+a);

  a=0;

  System.out.println("小闹了一下(a=0),嘿嘿!");

  }

  return 250;

  }

  public static void main(String[] args) {

  FinallyTest2 t=new FinallyTest2();

  System.out.println("方法返回(return) :"+t.test());

  }

  }

  /*

  运行结果:

  Finally执行,a值为:1314520

  小闹一下(a=0),嘿嘿!

  方法返回(return) :1314520

  总结:

  在try语句块中运行到了return时,并不是立即返回而是把return要返回的值计算出来先保存到内存中,然后去执行finally语句块,然后再返回之前保存要return的值。

  */

  四、在返回之前执行在finally块中的语句,哪finally块中也return会怎么样呢?

  public class FinallyTest3 {

  //@SuppressWarnings 批注允许您选择性地取消特定代码段(即,类或方法)中的警告。

  @SuppressWarnings("finally")

  private int test(){

  try{

  return 520;

  }catch(Exception e){

  System.out.println();

  }finally{

  return 5820; //此处return语句会产生警告

  }

  }

  public static void main(String[] args) {

  FinallyTest3 t=new FinallyTest3();

  System.out.println("方法返回(return) :"+t.test());

  }

  }

  /*

  运行结果:

  方法返回(return) :5820

  总结:

  如果try和finally都有return 语句,则返回值以最后一个return语句的值作为返回,前面的一个被默认的牺牲啦。

  */