java抛出异常后面的代码是否能执行及 return 语句执行情况

1. 抛出异常后的代码执行情况

下面使用三段代码进行测试
代码1
public static void test1() throws Exception  {
    throw new Exception("参数越界"); 
    System.out.println("异常后"); //编译错误,「无法访问的语句」
}
代码2
    public static void test2() throws Exception {
        try {
            throw new Exception("参数越界");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("异常后"); // 可以执行
    }

代码3
    public static void test3() throws Exception {
        if (true) {
            throw new Exception("参数越界");
        }
        System.out.println("异常后"); //抛出异常,但不会执行
    }

代码4
    public static void test4() throws Exception {
        try{
            throw new Exception("参数越界");
            
        }catch (Exception e){
            System.out.println("catch");
            return;
        }

        System.out.println("异常后"); // 编译错误,「无法访问的语句」
    }
总结:
  1. 若一段代码前有异常抛出,并且这个异常没有被捕获,这段代码将产生编译时错误「无法访问的语句」。如代码1
  2. 若一段代码前有异常抛出,并且这个异常被try…catch所捕获,若此时catch语句中没有抛出新的异常,则这段代码能够被执行,否则,同第1条。如代码2
  3. 若在一个条件语句中抛出异常,则程序能被编译,但后面的语句不会被执行。如代码3
  4. 若cath语句中使用return ,则如果有异常抛出, 被catch 捕捉到, 那么后面的语句都不会被执行, 并且会抛出编译错误 ,如代码4

参考:
java中异常抛出后代码还会继续执行吗

2. Java中try catch finally语句中含有return语句的执行情况

首先, 不建议在 finally 语句块中使用 return 语句, 因为 finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了

对于含有return语句的情况,这里可以简单地总结如下:

try语句在返回前,将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:

1. 情况一:

如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。

2. 情况二:

如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。

3. 情况三:

如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况:

​ 1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。

​ 2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

参考:
Java中try catch finally语句中含有return语句的执行情况(总结版)

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值