关于java 异常捕捉 ( try catch finally ) 执行流程

java中使用try catch finally做异常处理的情形较为常见,关于执行具体不同情况下的执行流程,在另一篇帖子中看到,说明较为详细,但例子没看太懂,故用自己的代码做贴留念。

参考博客

以下内容在‘假设方法需要返回值’的前提下,如没有此前提,便没有探究执行流程的必要。

主要代码(通过加注释达到不同情况):

public class Hello {
    public static void main(String[] args){
        System.out.println(tryCatchTest());
    }
    public static String tryCatchTest(){
        try {
            int i = 1 / 0;      //引发异常的语句
            System.out.println("try 块中语句被执行");
            return "try 块中语句 return";
        }
        catch (Exception e){
            System.out.println("catch 块中语句被执行");
            return "catch 块中语句 return";
        }
        finally {
            System.out.println("finally 块中语句被执行");
            return "finally 块中语句 return";
        }
    }
}

情况种类(忽略catch语句)

  1. 如果没有 finally 代码块,整个方法在执行完 try 代码块后返回相应的值来结束整个方法;
  2. 如果有 finally 代码块,此时程序执行到 try 代码块里的 return 语句之时并不会立即执行 return,而是先去执行 finally 代码块里的代码,
    2.1 若 finally 代码块里没有 return 或没有能够终止程序的代码,程序将在执行完 finally 代码块代码之后再返回 try 代码块执行 return 语句来结束整个方法;
    2.2 若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return。

代码演示:

情况1

public class Hello {
    public static void main(String[] args){
        System.out.println(tryCatchTest());
    }
    public static String tryCatchTest(){
        try {
//            int i = 1 / 0;      //引发异常的语句
            System.out.println("try 块中语句被执行");
            return "try 块中语句 return";
        }
        catch (Exception e){
            System.out.println("catch 块中语句被执行");
            return "catch 块中语句 return";
        }
//        finally {
//            System.out.println("finally 块中语句被执行");
//            return "finally 块中语句 return";
//        }
    }
}

结果

try 块中语句被执行
try 块中语句 return

情况2.1

public class Hello {
    public static void main(String[] args){
        System.out.println(tryCatchTest());
    }
    public static String tryCatchTest(){
        try {
//            int i = 1 / 0;      //引发异常的语句
            System.out.println("try 块中语句被执行");
            return "try 块中语句 return";
        }
        catch (Exception e){
            System.out.println("catch 块中语句被执行");
            return "catch 块中语句 return";
        }
        finally {
            System.out.println("finally 块中语句被执行");
//            return "finally 块中语句 return";
        }
    }
}

结果

try 块中语句被执行
finally 块中语句被执行
try 块中语句 return

情况2.2

public class Hello {
    public static void main(String[] args){
        System.out.println(tryCatchTest());
    }
    public static String tryCatchTest(){
        try {
//            int i = 1 / 0;      //引发异常的语句
            System.out.println("try 块中语句被执行");
            return "try 块中语句 return";
        }
        catch (Exception e){
            System.out.println("catch 块中语句被执行");
            return "catch 块中语句 return";
        }
        finally {
            System.out.println("finally 块中语句被执行");
            return "finally 块中语句 return";
        }
    }
}

结果

try 块中语句被执行
finally 块中语句被执行
finally 块中语句 return

如果有catch块,基本和上面情况相似,只不过是把catch块续到try块引发异常语句后面,finally的地位依旧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值