• 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的。
    

      

  • 相关阅读:
    iOS 中架构模式的浅显理解
    Block 在 ARC 下的拷贝
    Repo 的使用小结
    博客园新语言代码高亮以及OpenLiveWriter插件开发(一)
    GridLayout 使用
    PopupWindow 使用
    NDK笔记(二)-在Android Studio中使用ndk-build
    NDK 笔记(一)
    Java 多线程编程
    搭建Apache Web服务器
  • 原文地址:https://www.cnblogs.com/achievement-active/p/9308522.html
Copyright © 2020-2023  润新知