java try throw exception finally 遇上 return break continue造成异常丢失

如下所示,是一个java笔试题,考察的是抛出异常之后,程序运行结果,但是这里抛出异常,并没有捕获异常,而是通过finally来进行了流程控制处理。

java 复制代码
package com.xxx.test;

public class ExceptionFlow {
    public static void main(String[] args) {
        try {
            System.out.println("hello " + func());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static int func() {
        int a = 0;
        for (int i = 0; i < 3; i++) {
            try {
                throw new RuntimeException("xx");
            } finally {
                 continue;
            }
        }
        return a;
    }
}

运行程序,打印结果如下所示:

这里结果有些出人意料,并没有打印异常信息,其实就是try finally遇到了continue,导致异常信息丢失。如果这里,我们稍微改变一下,把finally中的continue注释,再来看看结果:

这次打印了异常信息。

下面再来看看另一个例子:

java 复制代码
package com.xxx.test;
public class ExceptionDemo {
    public static void main(String[] args) {
        try {
            func();
            System.out.println("A");
        } catch (Exception e) {
            System.out.println("C");
        }
        System.out.println("D");
    }

    public static void func() {
        try {
            throw new Exception();
        } finally {
            System.out.println("B");
        }
    }
}

这里要求写出程序运行结果。

这道题的答案其实就是编译不通过,如下所示:

这里需要在func方法签名上声明抛出异常。方法签名上添加了抛出异常,这里就编译成功,运行结果是B C D。

这里其实也可以不用在方法签名上进行声明,直接把异常改成自定义异常RuntimeException("xx"),最终程序运行结果也是一样的。

这里我们按照第一个题目的思路,把finally中添加return信息,这时候,运行结果会变为B A D。

因为异常信息丢失,所以在调用func()的地方,进行try catch的时候,就不会有异常信息,那么程序就会按照正常的流程运行。

相关推荐
宸津-代码粉碎机6 分钟前
告别手动Jar部署!生产级无损热部署方案,彻底解决OOM与更新失效问题
java·大数据·开发语言·人工智能·python
米码收割机8 分钟前
【移动】线上购物移动端网站(源码+文档)【独一无二】
java·开发语言·前端·python·django
无敌秋23 分钟前
python/c++/java上云
java·c++·python
都叫我大帅哥32 分钟前
BCrypt 还是 Argon2?Spring Security 密码加密方案深度解析与实战对比
java·spring
IKUN家族9 小时前
Spring MVC(一)
java·spring·mvc
老马识途2.010 小时前
关于跨域问题的总结
java·前端
都叫我大帅哥11 小时前
Java日期时间三十年战争:从Date考古到LocalDateTime革命,以及数据库与前端的那点事儿
java
Muscleheng11 小时前
SpringBoot 集成 DeepSeek 实现 RAG 文档问答
java·spring boot·ai·springai
2501_9364156911 小时前
可变参数&综合练习&斗地主游戏
java·windows·游戏
极客先躯13 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试