zoukankan      html  css  js  c++  java
  • Java中try,catch,finally的用法

      Java中try,catch,finally的用法,以前感觉还算熟悉,但看到一篇博文才有更深点的理解,总结网友博客如下。

    Java异常处理的组合方式:

    1.try+catch 
      运行流程:运行到try块中,如果有异常抛出,则转到catch块去处理。然后执行catch块后面的语句 

    2.try+catch+finally 

      运行流程:运行到try块中,如果有异常抛出,则转到catch块,catch块执行完毕后,执行finally块的代码,再执行finally块后面的代码。

      如果没有异常抛出,执行完try块,也要去执行finally块的代码。然后执行finally块后面的语句 

    3.try+finally 
      运行流程:运行到try块中,如果有异常抛出的话,程序转向执行finally块的代码。那末finally块后面的代码还会被执行吗?不会!因为你没有处理异常,所以遇到异常后,执行完finally后,方法就以抛出异常的方式退出。 
      这种方式中要注意的是,由于你没有捕获异常,所以要在方法后面声明抛出异常。

    共同点:
    1. 在catch块和finally块中仍然可以再抛出新的异常
      例如 throw new Exception("illegal invoked");
      如果对于新抛出的异常没有写try的话,则要在方法后面声明抛出异常

      反之,如果给catch块或finally块里的异常再套上一层try,catch的话,方法后面就不必声明异常了。

    问题:try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 

    我们来看下面代码:

    public  class Test {  
      
        /** 
         * @param args add by zxx ,Dec 9, 2008 
         */  
        public static void main(String[] args) {  
            // TODO Auto-generated method stub  
            System.out.println(new Test().test());;  
        }  
      
        static int test()  
        {  
            int x = 1;  
            try  
            {  
                return x;  
            }  
            finally  
            {  
                ++x;  
            }  
        }  
          
    } 

    ---------执行结果 ---------
    1

    public class  smallT  
    {  
        public static void  main(String args[])  
        {  
            smallT t  = new  smallT();  
            int  b  =  t.get();  
            System.out.println(b);  
        }  
          
        public int  get()  
        {  
            try  
            {  
                return 1 ;  
            }  
            finally  
            {  
                return 2 ;  
            }  
        }  
    } 
     

    ---------执行结果 ---------
    2

    public  class Test {  
      
        /** 
         * @param args add by zxx ,Dec 9, 2008 
         */  
        public static void main(String[] args) {  
            // TODO Auto-generated method stub  
            System.out.println(new Test().test());;  
        }  
      
        int test()  
        {  
            try  
            {  
                return func1();  
            }  
            finally  
            {  
                return func2();  
            }  
        }  
          
        int func1()  
        {  
            System.out.println("func1");  
            return 1;  
        }  
        int func2()  
        {  
            System.out.println("func2");  
            return 2;  
        }     
    }  

    -----------执行结果-----------------
    func1
    func2
    2

    分析:

      从上面3个例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

  • 相关阅读:
    JVM致命错误日志(hs_err_pid.log)分析
    JVM调优-命令大全(jps jstat jmap jhat jstack jinfo
    GC日志分析详解
    简单的学习,实现,领域事件,事件存储,事件溯源
    学习DDD的初步尝试,从最基础的开始,业务介绍,划分限界上下文 ,建立模型
    .Net Core + DDD基础分层 + 项目基本框架 + 个人总结
    第三节:使用Log4net和过滤器记录异常信息,返回异常给前端
    从一层到多层架构的学习笔记
    学习服务之间的调用,三个方法的演化
    .Net Core3.0 WEB API 中使用FluentValidation验证,实现批量注入
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/7337607.html
Copyright © 2011-2022 走看看