try catch finally语句块详细讲解

简介

     try catch finally语句块有不少烦、杂、难的问题, 有点头痛、本文章重在解决该类问题。

1、无论有没异常、finally都是执行。

   这个自然不用多说、finally块解决的就是这种问题。常用在资源释放, 如关闭IO流、数据库连接等。

2、当try和catch中有return时,finally仍然会执行;

 

public class BarRun {
 public static void main(String[] args)
 {
     int re = bar();
     System.out.println(re);
 }
 private static int bar()
 {
   int a=1;
     try{
         return a;
     }catch(Exception e){
      return 0;
      
     } finally{
      
         System.out.println("finally");
     }
  
 }

3、finally是在return后面的表达式运算后执行的。

    这句话乍一看较难理解, 意思是: return 并没有返回运算后的值,而是向同一个内存地址(假设地址是0x88)写入返回值,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;

public class BarRun {
    public static void main(String[] args)
    {
        int re = bar();
        System.out.println(re);
    }
    private static int bar() 
    {
         int a=1;
        try{
            return a;
        }catch(Exception e){
            return 0;
            
        } finally{
            a++;//改变a变量的值是不影响内存0x88内容的;
            System.out.println("finally");
        }
        
    }

4、finally存在return语句, 将覆盖(修改)try或者catch中的return值。

   try块return a; 将返回值写入到内存地址0x88, 内容为1,但是不会马上执行return返回。 接下来执行finally块, return ++a, 修改0x88的内容为2, 接着执行return ;

package it.ctf;

public class BarRun {
    public static void main(String[] args)
    {
        int re = bar();
        System.out.println(re);
    }
    private static int bar() 
    {
         int a=1;
        try{
            return a;
        }catch(Exception e){
            return 0;
            
        } finally{
            System.out.println("finally");
            return ++a;
        }
        
    }
    /*输出:
    finally
    2
    */

}
总结: (1)任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
     (2)如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的。

  

 

posted @ 2018-07-14 09:28  BlueWolfThe  阅读(598)  评论(0编辑  收藏  举报