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的时候,就不会有异常信息,那么程序就会按照正常的流程运行。

相关推荐
IDRSolutions_CN1 分钟前
PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第二部分)
java·经验分享·pdf·软件工程·团队开发
hello早上好4 分钟前
Spring不同类型的ApplicationContext的创建方式
java·后端·架构
HelloWord~1 小时前
SpringSecurity+vue通用权限系统2
java·vue.js
让我上个超影吧1 小时前
黑马点评【基于redis实现共享session登录】
java·redis
BillKu2 小时前
Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
java·tomcat·mybatis
全栈凯哥2 小时前
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
java·算法·leetcode·链表
chxii2 小时前
12.7Swing控件6 JList
java
全栈凯哥2 小时前
Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
java·算法·leetcode·链表
YuTaoShao2 小时前
Java八股文——集合「List篇」
java·开发语言·list
PypYCCcccCc2 小时前
支付系统架构图
java·网络·金融·系统架构