Java7的异常处理新特性addSuppressed()方法

news2024/11/25 11:01:38

学习使用Java7新语法try-with-resources,在查看编译文件时,接触到addSuppressed()方法。记录一下使用方式。

先来看一段代码:

private static void testt() {
    try (InputStream is = CatchTest.class.getClassLoader().getResourceAsStream("/data/1.txt");)
    { 
        int content;
        while ((content = is.read()) != -1) {
            System.out.print((char)content);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

反编译后:

1、try-catch-resource异常传播:

1)try-catch-finally中:

不论try语句块中是否有异常抛出,finally语句块始终会被执行。如果关闭失败,InputStream’s close()方法也可能会抛出异常。

假设try语句块抛出一个异常,然后finally语句块被执行。同样假设finally语句块也抛出了一个异常。那么哪个异常会根据调用栈往外传播?

即使try语句块中抛出的异常与异常传播更相关,最终还是finally语句块中抛出的异常会根据调用栈向外传播。

2)try-with-resources中:

当try-with-resources结构中抛出一个异常,同时FileInputStreami被关闭时(调用了其close方法)也抛出一个异常,try-with-resources会把两次异常都记录下来。从上面反编译的代码中可以看到,包含了addSuppressed()方法,这个方法作用是保证一个异常不被另外一个异常抑制而无法抛出,比如try-catch块代码抛异常,程序会继续执行finally代码,但如果finally代码又抛错,就会导致try-catch的异常无法正常抛出,此时可以使用addSuppressed()方法可以将被抑制的异常也抛出。

2、addSuppressed()方法使用

try-catch-finally结构中,在try语句块中抛出了异常,在控制权转移到调用栈上一层代码之前,finally语句块中的语句也会执行。但是finally语句块在执行的过程中,也可能会抛出异常。如果finally语句块也抛出了异常,那么这个异常会往上传递,而之前try语句块中的那个异常就丢失了。如例看一个例子:

private static void test() throws Exception {
    try {
        Integer.parseInt("Hello");
    } catch (NumberFormatException arg7) {
        throw new Exception(arg7);
    } finally {
        try {
            int e2 = 2 / 0;
            System.out.println(e2);
        } catch (ArithmeticException arg6) {
            throw new Exception(arg6);
        }
    }

}

执行后:

对这种问题的解决办法一般有两种:一种是抛出try语句块中产生的原始异常,忽略在finally语句块中产生的异常。这么做的出发点是try语句块中的异常才是问题的根源。如例:

private static void test1() throws Exception {
    Exception exception = null;
    try {
        Integer.parseInt("Hello");
    } catch (NumberFormatException e1) {
        exception = e1;
    } finally {
        try {
            int result = 2 / 0;
            System.out.println(result);
        } catch (ArithmeticException e2) {
            if (exception == null) {
                exception = e2;
            }
        }
        if (exception != null) {
            throw exception;
        }
    }
}

执行后:

另外一种是把产生的异常都记录下来。这么做的好处是不会丢失任何异常。在java7之前,这种做法需要实现自己的异常类,而在java7中,已经对Throwable类进行了修改以支持这种情况。在java7中为Throwable类增加addSuppressed方法。当一个异常被抛出的时候,可能有其他异常因为该异常而被抑制住,从而无法正常抛出。这时可以通过addSuppressed方法把这些被抑制的方法记录下来。被抑制的异常会出现在抛出的异常的堆栈信息中,也可以通过getSuppressed方法来获取这些异常。这样做的好处是不会丢失任何异常,方便开发人员进行调试。如例:

private static void test2() throws Exception {
    Exception exception = null;
    try {
        Integer.parseInt("Hello");
    } catch (NumberFormatException e1) {
        exception = e1;
    } finally {
        try {
            int result = 2 / 0;
            System.out.println(result);
        } catch (ArithmeticException e2) {
            if (exception != null) {
                exception.addSuppressed(e2);
            } else {
                exception = e2;
            }
        }
        if (exception != null) {
            throw exception;
        }
    }
}

执行后:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThinkPHP 多应用模式初探

还是很久以前用tp3.0开发过项目,之后就再没使用过,现在tp都更新到6了,与之前差距很大,需要重新练习掌握最新的tp框架使用及特性。 目录 1.安装框架 2.安装多应用模式扩展think-multi-app 3.目录结构修改并创建应用子目录 4.应…

年后市场将反弹?服装人做好这些准备,才能赚到2023年第一桶金!

目前,随着防疫政策精准落地、逐步放开,人们对疫情的科学认知不断更新,市场活跃度正逐步恢复。秦丝通过与数万服装老板沟通交流,发现新的模式也在渐渐兴起,国内服装市场将有望迎来反弹。 1、消费氛围活跃,市…

善网ESG周报(第六期)

ESG报告: 宁夏建投城运首份社会责任(ESG)报告正式发布 12月20日,宁夏建投城市运营管理有限公司发布首份ESG报告。报告显示,其公司将业务与环境保护、社会责任、公司治理相结合打造一条绿色发展道路。 国寿股权投资发…

滚动条基本样式设置

::-webkit-scrollbar 系列属性 详细使用说明 ::-webkit-scrollbar注意:如果没有设置滚动溢出的相关属性,滚动条样式系列属性不会生效(resize 除外)。属性 ::-webkit-scrollbar 整个滚动条。::-webkit-scrollbar-button 滚动条上的…

Vue3组件化开发(一)

文章目录p11 组件组件的拆分和嵌套组件的CSS作用域组件的通信父子组件的通信父组件传递给子组件props的对象用法非prop的attribute子组件传递给父组件案例p11 组件 组件的拆分和嵌套 推荐安装的VS Cdoe插件 组件的CSS作用域 组件的通信 父子组件的通信 父组件传递给子组件…

模型初始化

在深度学习模型训练中,权重初始值极为重要,一个好的初始值会使得模型收敛速度提高,使模型准确率更准确,一般情况下,我们不使用全零初始值训练网络,为了利于训练和减少收敛时间,我们需要对模型进…

从入门到项目实战 - Vue 计算属性用法解析

Vue 计算属性用法解析上一节:《Vue 监听器用法解析 》| 下一节:《Vue 样式绑定》jcLee95 邮箱 :291148484163.com CSDN 主页:https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 本文地址:https://blog.…

衣服、商品、商城网站模板首页,仿U袋网,vue+elementui简洁实现(二)

一.前言 接上一遍博客:《衣服、商品、商城网站模板首页,仿U袋网,vueelementui简洁实现》 在此基础上增加了和完善一些页面: 商品分类筛选页面登录、注册、找回密码共用页面U袋学堂(视频专区,视频播放&am…

编译原理——参数传递—传名、传地址、得结果、传值

1.传名(替换操作) 把这种方式理解为替换操作,把P函数参数X、Y、Z和P函数内部的Y、Z替换为A、B,然后P函数对Y、Z的操作,其实就是对A、B的操作;需要注意这和传地址一样,上面对A造成的变化&#x…

制品仓库 Nexus 安装、配置、备份、使用

目录 1.1 Nexus 优点 1.2 Nexus 仓库类型 2. 安装 Nexus 2.1 设置持久化目录 2.2 拉取 Nexus docker 镜像 2.3 运行并启动 Nexus 3. 系统配置 3.1 配置管理员密码 3.2 配置 LDAP 3.3 配置 Email 服务器 4. 配置 Repository 4.1 添加 Blob Stores 4.2 添加 Reposit…

软考高级考哪个好?

软考高级一共5个科目,含金量都差不多,每个人考证的需求各不相同,合适自己情况的才是最有用的证书。看你自己的工作、专业与哪个更相近,再来深入学习备考的,当然自己也要对考试取证有一定的信心。 高级科目介绍&#x…

【LeetCode每日一题】——剑指 Offer II 072.求平方根

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目注意】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 二分查找 二【题目难度】 简单 三【题目编号】 剑指 Offer II 072.求平方根 …

《图解TCP/IP》阅读笔记(第七章 7.5)—— OSPF 开放最短路径优先协议

7.5 OSPF OSPF(Open Shortest Path First,开放最短路径优先)是一种链路状态性的路由协议,即使网络中有环路,也可以进行稳定的路由控制。 另外,OSPF支持子网掩码,使得在RIP中无法实现的可变长度…

在简历上写了“精通自动化测试,阿里面试官跟我死磕后就给我发了高薪 offer

事情是这样的 前段时间面试了阿里,大家也都清楚,如果你在简历上面写着你精通 XX 技术,那面试官就会跟你死磕到底。 我就是在自己的简历上写了精通自动化测试,然后就开启了和阿里面试官的死磕之路,结果就是拿到了一份…

【Lilishop商城】No4-2.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-平台注册会员接口开发

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑,其中重点包括接口类、业务类,具体的结合源代…

AMQP协议:消费者、生产者与RibbitMQ节点之间的交互流程,RibbitMQ的核心组成部分

原文链接 一、什么是AMQP协议? AMQP全称:Advanced Message Queuing Protocol(高级消息队列协议)。是应用层协议的一个开发标准,为面向消息的中间件设计。 基于此协议的客户端与消息中间件可以传递消息,不受客户端/中间件的不同产品…

小程序之首页搭建——Flex布局

目录 Flex布局简介 什么是flex布局? flex属性 学习地址: 视图层 View WXML 数据绑定 列表渲染 条件渲染 模板 WXSS 尺寸单位 样式导入 内联样式 选择器 全局样式与局部样式 WXS 示例 注意事项 页面渲染 数据处理 会议OA项目-首页 …

Python实现照片、视频一键压缩及备份源代码

代码 完整代码下载地址:Python实现照片、视频一键压缩及备份源代码 第一次运行前先编辑脚本,修改其中的主库位置、随库位置,保存。 此后要更新随库时,只要双击运行脚本即可。 运行结果示例: 主库位置:D…

用了这么多年的 SpringBoot 你知道什么是 SpringBoot 的 Web 类型推断吗?

用了这么多年的 SpringBoot 那么你知道什么是 SpringBoot 的 web 类型推断吗? 估计很多小伙伴都不知道,毕竟平时开发做项目的时候做的都是普通的 web 项目并不需要什么特别的了解,不过抱着学习的心态,阿粉今天带大家看一下什么是 …

jQuery库冲突

文章目录jQuery库冲突原因jQuery.noConflict()如还想使用$可以这么做jQuery库冲突 原因 在某些情况下,可能有必要在同一个页面中使用多个JavaScript库。但是很多库都使用了“$”这个符号(因为它简短方便),这时就需要用一种方式来…