Java try/catch/finally内部执行顺序&外部语句何种情况下执行

Posted 浅然言而信

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java try/catch/finally内部执行顺序&外部语句何种情况下执行相关的知识,希望对你有一定的参考价值。

该篇博客说说try/catch语句的一些执行逻辑,因为有很多人并没有弄清楚到底try、catch、finally语句是怎么样执行的。

一、try/catch/finally中的语句执行先后

1、如果catch中有return或者throw,执行顺序如下

  • catch中的非return或thorw语句
  • finally中的非return或throw语句
  • catch中的return或throw语句

    package testexception;

    public class testException
    public static void main(String[] args)
    //测试
    double sum = test();
    System.out.println(sum);

    public static double test() 
        double sum = 0;
        try 
            sum = 1/0;
            System.out.println("try....");  //不执行
        catch(ArithmeticException e) 
            System.out.println("message:"+e.getMessage());
            return 1.0;
            //throw e;
        finally
            System.out.println("finally....");
        
        return 2.0;                         //不执行
    
    

运行结果:

2、如果catch中有return或者throw,并且finally中也有return或throw,执行顺序如下

  • catch中的非return或thorw语句
  • finally中的非return或throw语句
  • catch中的return或throw语句
  • finally中的return或throw语句

    package testexception;
    
    public class testException 
        public static void main(String[] args) 
            //测试
            double sum  = test();
            System.out.println(sum);
        
    
        public static double test() 
            double sum = 0;
            try 
                sum = 1/0;
                System.out.println("try....");  //不执行
            catch(ArithmeticException e) 
                System.out.println("message:"+e.getMessage());
                return 1.0;
                //throw e;
            finally
                System.out.println("finally....");
                return 2.0;
            
        
    
    

运行结果:(可以看出最后返回值为2.0)


二、什么情况下try/catch/finally语句块之后的语句会执行

1、进行正常捕获处理时:会执行

package testexception;

public class testException 
    public static void main(String[] args) 
        //测试
        double sum  = test();
        System.out.println(sum);
    

    public static double test() 
        double sum = 0;
        try 
            sum = 1/0;
            System.out.println("try....");  //不执行
        catch(ArithmeticException e) 
            System.out.println("捕获处理中....");
        finally
            System.out.println("finally....");
        
        System.out.println("看看try/catch/finally外面的语句执不执行"); 
        return 3.0;
    

运行结果:

2、捕获后又抛出:不执行

package testexception;

public class testException 
    public static void main(String[] args) 
        //测试
        double sum  = test();
        System.out.println(sum);
    

    public static double test() 
        double sum = 0;
        try 
            sum = 1/0;
            System.out.println("try....");  //不执行
        catch(ArithmeticException e) 
            System.out.println("捕获处理中....");
            throw e;
        finally
            System.out.println("finally....");
        
        System.out.println("看看try/catch/finally外面的语句执不执行"); 
        return 3.0;
    

运行结果:

3、比如是一个ArithmeticException异常换成其他异常(非Exception):不执行

package testexception;

public class testException 
    public static void main(String[] args) 
        //测试
        double sum  = test();
        System.out.println(sum);
    

    public static double test() 
        double sum = 0;
        try 
            sum = 1/0;
            System.out.println("try....");  //不执行
        catch(NullPointerException e) 
            System.out.println("捕获处理中....");
        finally
            System.out.println("finally....");
        
        System.out.println("看看try/catch/finally外面的语句执不执行"); 
        return 3.0;
    

运行结果:

当然最后要注意的是try语句块中异常出现的位置,其在try中之后的语句都不会执行

以上是关于Java try/catch/finally内部执行顺序&外部语句何种情况下执行的主要内容,如果未能解决你的问题,请参考以下文章

关于try catch finally的执行顺序解释

java中的“try - catch -finally”结构中的“finally”都有哪些用途

java之try catch finally

java try catch finally return执行顺序

Java Try Catch finally 没有 Catch 的块

Java深入学习23:try catch finally执行和返回逻辑