抑制java对修饰符的检查_Java 7对抑制异常的支持

抑制java对修饰符的检查

在JDK 7中 ,向Throwable类( Exception和Error类的父类)添加了一个新的构造函数和两个新方法。 添加了新的构造函数和两个新方法以支持“抑制的异常”(不要与吞咽或忽略异常的不良做法相混淆)。 在本文中,我将探讨为什么引入这些方法以及它们在JDK 7中的使用方式。我简短讨论了抑制异常与链式异常的不同之处。

被抑制的异常在新的Java 7 try-with-resources语句 (也称为自动资源管理 [ ARM ])的执行中起着重要作用。 为这种新的资源管理功能提供API支持似乎已成为Throwable类上新的构造函数和方法的主要驱动程序,该类提供了对抑制异常的访问,但是API支持在try-with-resources语句之外使用抑制异常。 。

遇到被抑制的异常的最常见用例是,当try-with-resources语句(这是一种尝试类型,根据Java语言规范Java SE 7 Edition 14.20 ,它不需要catch或finally子句时)遇到一个异常。 try块中的异常,然后在隐式尝试关闭相关资源时遇到另一个异常。

为了说明这种情况,我组成了自己的“资源”,可以在try-with-resource语句中使用它,因为它实现了java.lang.AutoCloseable接口。 当使用它的代码尝试使用它时,此“顽皮资源”会故意引发异常,然后在调用重写的close方法(由AutoCloseable接口指定的唯一方法)时引发另一个异常,从而继续其不良形式。 接下来显示NaughtyResource的代码清单。

NaughtyResource.java

package dustin.examples;/*** Resource that throws exceptions both in its use and its closure and is only* intended for use in demonstrating Java 7's suppressed exceptions APIs. This* is not a well-behaved class.* * @author Dustin*/
public class NaughtyResource implements AutoCloseable
{/*** Method that intentionally throws an exception.* * @throws RuntimeException Thrown no matter how you call me.*/public void doNothingGood(){throw new RuntimeException("Nothing good can come of this.");}/*** The overridden closure method from AutoCloseable interface.* * @throws Exception Exception that might be thrown during closure of this*    resource.*/@Overridepublic void close() throws Exception{throw new UnsupportedOperationException("Not supported yet.");}
}

现在有了顽皮的资源,是时候使用顽皮的资源并演示抑制异常API。 下一张图像描述了如果尝试使用该资源而不捕获close方法隐式抛出的Exception且未声明该方法抛出该异常的情况。

这是javac提供的错误消息,如以下屏幕快照所示。

我已经显示了前两个屏幕快照,以强调对资源执行的隐式关闭调用。 NetBeans编辑器和控制台中显示的错误消息清楚地表明了这种情况。

下一个代码清单包含编译的SuppressedExceptions类的第一个版本。

SuppressedExceptions.java(版本1)

package dustin.examples;/*** Demonstrate JDK 7's Suppressed Exceptions API support.* * @author Dustin*/
public class SuppressedExceptions
{/*** Executable function demonstrating suppressed exceptions.* * @param arguments The command line arguments; none expected.*/public static void main(String[] arguments) throws Exception{try (NaughtyResource naughty = new NaughtyResource()){naughty.doNothingGood();}}
}

尽管在执行上述代码时确实遇到了两个异常(一个在NaughtyResource.doNothingGood()调用的try块内,一个在隐式调用close方法的调用中),但只有一个渗透到顶部,并在应用程序显示时显示。运行。 下一个屏幕快照对此进行了演示。

如最后一张图片所示,仅显示try-with-resources语句的try try块中遇到的异常。 在这里,可以向Throwable(在这种情况下为Exception)询问其受抑制的异常的功能非常有用。 为了证明这一点,接下来显示SuppressedExceptions类的版本2(使用Throwable.getSuppressed() )。

SuppressedExceptions.java(版本2)

package dustin.examples;import static java.lang.System.err;/*** Demonstrate JDK 7's Suppressed Exceptions API support.* * @author Dustin*/
public class SuppressedExceptions
{/*** Method that uses NaughtyResource with try-with-resource statement.* * @throws Exception Expected exception for try-with-resource used on the*    NaughtyResource.*/public static void performTryWithResource() throws Exception{try (NaughtyResource naughty = new NaughtyResource()){naughty.doNothingGood();}  }/*** Executable function demonstrating suppressed exceptions.* * @param arguments The command line arguments; none expected.*/public static void main(String[] arguments){try{performTryWithResource();}catch (Exception ex){err.println("Exception encountered: " + ex.toString());final Throwable[] suppressedExceptions = ex.getSuppressed();final int numSuppressed = suppressedExceptions.length;if (numSuppressed > 0){err.println("\tThere are " + numSuppressed + " suppressed exceptions:");for (final Throwable exception : suppressedExceptions){err.println("\t\t" + exception.toString());}}}}
}

上面的应用程序将打印出所有抑制的异常。 在这种情况下,尝试关闭NaughtyResource时遇到的异常现在显示为被抑制的异常之一。 下一个屏幕快照对此进行了演示。

如Java教程中所述,我们看到唯一抛出的异常是在try-with-resources语句的try块中遇到的异常,并且在资源关闭期间遇到的第二个异常被“抑制”(但仍可从实际抛出异常)。

不需要使用try-with-resources来处理抑制的异常。 下一个代码清单将SuppressedExceptions改编为使用更传统的try-finally。

SuppressedExceptions.java(版本3)

package dustin.examples;import static java.lang.System.err;/*** Demonstrate JDK 7's Suppressed Exceptions API support.* * @author Dustin*/
public class SuppressedExceptions
{/*** Method that uses NaughtyResource with JDK 7 try-with-resource statement.* * @throws Exception Expected exception for try-with-resource used on the*    NaughtyResource.*/public static void performTryWithResource() throws Exception{try (NaughtyResource naughty = new NaughtyResource()){naughty.doNothingGood();}  }/*** Method that uses NaughtyResource with traditional try-finally statement.* * @throws Exception Exception thrown during use of NaughtyResource.*/public static void performTryFinally() throws Exception{final NaughtyResource naughty = new NaughtyResource();try{naughty.doNothingGood();}finally{naughty.close();}}/*** Executable function demonstrating suppressed exceptions.* * @param arguments The command line arguments; none expected.*/public static void main(String[] arguments){try{
//         performTryWithResource();performTryFinally();}catch (Exception ex){err.println("Exception encountered: " + ex.toString());final Throwable[] suppressedExceptions = ex.getSuppressed();final int numSuppressed = suppressedExceptions.length;if (numSuppressed > 0){err.println("\tThere are " + numSuppressed + " suppressed exceptions:");for (final Throwable exception : suppressedExceptions){err.println("\t\t" + exception.toString());}}else{err.println("\tNo Suppressed Exceptions.");}}}
}

上面的代码调用了一种使用try-finally的方法,其行为与try-with-resources示例的行为不同,如下面的屏幕快照所示。

try-finally显示尝试关闭资源时遇到的异常,而不是使用资源时遇到的异常(上面显示的try-with-resources相反)。 另一个区别是,即使在try-finally情况下,作为抑制的异常,其他异常也不可用。 这是广为宣传的 “ 丢失的异常 ”问题的一个示例 ,该问题可能包含潜在的“琐碎”异常(关闭资源),而隐藏了潜在的更重要的异常(实际上是在使用资源)。

如果我想同时查看NaughtyResource的使用和关闭过程中引发的异常以及try-finally,可以使用Throwable.addSuppressed(Throwable) ,如下面的代码清单所示。 在该清单中,对try和finally子句进行了增强,以捕获在使用NaughtyResource期间引发的异常,并将捕获的异常添加到实际抛出的异常中作为抑制的异常。

SuppressedExceptions.java(版本4)

package dustin.examples;import static java.lang.System.err;/*** Demonstrate JDK 7's Suppressed Exceptions API support.* * @author Dustin*/
public class SuppressedExceptions
{/*** Method that uses NaughtyResource with JDK 7 try-with-resource statement.* * @throws Exception Expected exception for try-with-resource used on the*    NaughtyResource.*/public static void performTryWithResource() throws Exception{try (NaughtyResource naughty = new NaughtyResource()){naughty.doNothingGood();}  }/*** Method that uses NaughtyResource with traditional try-finally statement.* * @throws Exception Exception thrown during use of NaughtyResource.*/public static void performTryFinally() throws Exception{final NaughtyResource naughty = new NaughtyResource();Throwable throwable = null;try{naughty.doNothingGood();}catch (Exception usingEx){throwable = usingEx;}finally{try{naughty.close();}catch (Exception closingEx){if (throwable != null){closingEx.addSuppressed(throwable);throw closingEx;}}}}/*** Executable function demonstrating suppressed exceptions.* * @param arguments The command line arguments; none expected.*/public static void main(String[] arguments){try{
//         performTryWithResource();performTryFinally();}catch (Exception ex){err.println("Exception encountered: " + ex.toString());final Throwable[] suppressedExceptions = ex.getSuppressed();final int numSuppressed = suppressedExceptions.length;if (numSuppressed > 0){err.println("\tThere are " + numSuppressed + " suppressed exceptions:");for (final Throwable exception : suppressedExceptions){err.println("\t\t" + exception.toString());}}else{err.println("\tNo Suppressed Exceptions.");}}}
}

修改后的类的输出如下所示。 请注意,由于使用资源本身而导致的异常现在与作为抑制的异常而引发的异常相关联。 尽管此处未显示,但Throwable现在还提供了一个构造函数,该构造函数允许通过布尔参数来指定是否允许(启用)或禁止(禁止)新实例化的Throwable抑制异常。

查看抑制异常的另一个角度是完整堆栈跟踪。 以下三个图像是使用try-with-resources(显式显示假定的异常),使用传统的try-finally语句而未显式添加抑制的异常(因此在full stack跟踪中没有抑制的异常)导致的完整堆栈跟踪的屏幕快照。 ,并使用传统的try-finally方法,并明确添加抑制的异常(因此确实出现在完整堆栈跟踪中)。 我在每个图像上都添加了一条红线,以单独显示整个堆栈跟踪结束的地方,并在适用的情况下,圈出了对抑制异常的显式引用。

抑制的异常与链接的异常

禁止的异常与链接的异常不同 。 链接异常是JDK 1.4引入的,旨在使轻松跟踪异常之间的因果关系成为可能。 通常,链接的异常是由于将新引发的异常与已捕获并导致引发新异常的异常相关联而导致的。 例如,可能会引发未检查的异常,从而“包装”已捕获的已检查的异常,并且可以将它们链接在一起。

JDK 7引入了抑制异常,它与因果关系无关,而与在单个抛出的异常中表示可能相关但不一定因果的多个例外条件有关。 在上面的我的顽皮资源示例中,顽皮资源在其唯一方法被调用时的异常并不是导致它在调用其close方法时引发异常的原因。 因此,将两个异常关联起来(通过抑制的异常机制)比强迫一个异常似乎是造成连锁关系中另一个异常的原因更有意义。

通过比较Throwable访问每种类型的方法,快速了解连锁异常与抑制异常之间的区别可能是最容易的。 对于链式异常,将调用特定的Exception(Throwable)方法。 此方法返回导致Throwable的单个实例。 可以询问返回的Throwable的原因,并在导致Throwables的整个过程中重复该过程。 重要的观察结果是,每个给定的Throwable都有一个导致Throwable的原因。 这可以与Throwable在调用其getSuppressed()方法时提供多个抑制的Throwable(在数组中)的能力进行对比。

NetBeans推荐尝试资源

在这里值得注意的是,NetBeans会警告您尝试使用try-finally,并建议使用try-with-resources替换它,如我在我的文章《 用于现代化Java代码的七个NetBeans提示》和下面显示的屏幕快照中所讨论的。

结论

我相信很明显,为什么NetBeans建议开发人员将对资源处理的最后尝试更改为try-with-resources语句。 通常最好先了解资源上的哪个操作导致了异常,但是如果需要的话,也能够在关闭时访问异常是一件很不错的事情。 如果必须选择,我通常会对执行期间的资源问题更感兴趣,因为关闭问题可能是该问题的衍生形式。 但是,两者都更好。 传统的try-finally最终仅列出关闭时的异常,而无需付出额外的努力来中继这两个异常。 try-with-resource语句不仅更简洁; 由于内置支持包含抑制的异常,它也更加有用。

参考: JCG合作伙伴 Dustin Marx在Inspired by Actual Events博客上提供了Java 7对抑制异常的支持 。


翻译自: https://www.javacodegeeks.com/2012/04/java-7s-support-for-suppressed.html

抑制java对修饰符的检查

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

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

相关文章

编写基于事件的CQRS读取模型

关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是,尽管也有一些有趣的考虑,但读取模型经常被忽略。 在本文中,我们将展示一个通过使用事件流填充视图模型的示例实现。 总览 读取模型的想法…

java else if和switch_如何优雅地优化代码中的的if else和switch

引言一般来说,随着我们项目的迭代以及业务的越来越复杂,项目中的分支判断会原来越多。当项目中涉及到复杂的业务判断或者分支逻辑时,我们就需要考虑是否需要对项目进行重构了,或者if else和switch case是否能够满足当前项目的复杂…

jQuery data

一个简单的Cache (function(){var __cache {},Cache {get: function(__name){return __cache[__name] || undefined;}, set: function(__name, __value){return (__cache[__name] __value)}};this.Cache Cache; })();alert(Cache.get("name")); //undefine…

设计模式(中介者模式-对象去耦)

声明:本系列文章内容摘自《iOS设计模式》 中介者模式 用一个对象来封装一系列对象的交互方式。中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 何时使用中介者模式 1.对象间的交互虽定义明确然而非…

windows服务器的DDOS防御,

抵御 SYN 攻击 SYN 攻击利用了 TCP/IP 连接建立机制中的安全漏洞。要实施 SYN 洪水攻击,攻击者会使用程序发送大量 TCP SYN 请求来填满服务器上的挂起连接队列。这会禁止其他用户建立网络连接。 要保护网络抵御 SYN 攻击,请按照下面这些通用步骤操作&…

java程序运行结果题_2016年关于Java编程与程序运行结果笔试题

2016年关于Java编程与程序运行结果笔试题1.Java编程,打印昨天的当前时刻public class YesterdayCurrent{public void main(String[] args){Calendar cal Calendar.getInstance();cal.add(Calendar.DATE, -1);System.out.println(cal.getTime());}}2.文件读写,实现一个计数器pu…

Hystrix简介– Hello World

在先前的博客文章中,我谈到了需要像Netflix Hystrix这样的库的动机。 在这里,我将跳入一些非常基本的方法来开始使用Hystrix,并在更复杂的用例中进行后续介绍。 你好,世界 以下是“ Hystrix命令”的一个简单的Hello World示例&am…

js base64编码 java 解码_JavaScript字符串的Base64编码与解码

有时文本里包含一些不可打印的符号,而你需要把它们传输到服务器,这时我们会需要用到Base64编码。或者你需要把一个图片内容以文本格式嵌入到网页中,这时你也会用到 Base64 编码。所谓 Base64 是一种基于64个可打印字符来表示二进制数据的方法…

ssh图片上传 java_ssh上传并显示图片

struts部分:attribute"upfileForm"input"/upload/uploadfile.jsp"name"upfileForm"path"/upfile"scope"request"validate"true"type"com.yourcompany.struts.action.UpfileAction">publi…

责任链设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

使用JUnit规则进行干净的集成测试

JUnit Rules的优势,尤其是在进行集成测试时,几乎不能被高估。 在本文中,我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下,这些简化了灯具控制。 作为示例,我们将看看如何基于…

winform基础窗体设置及基础控件

WinForm - 也叫做C/S 客户端 另:B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要互联网的支持,代码部分在用户电脑上执行 使用…

【FastJSON】解决FastJson中“$ref 循环引用”的问题

0、开发环境 SSH&#xff0c;EasyUI&#xff0c;MySQL 1、需求要求&#xff1a; (1)首先获取所有的贷款订单数据&#xff0c;即List <LoanOrder>。 (2)然后从单个贷款订单实体LoanOrder去访问贷款人实体Loaner的信息。 2、实体之间的关系描述 (1)LoanOrder实体与Loaner…

JavaFX真实世界应用程序:EIZO CuratOR Caliop

JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行&#xff0c;并允许操作团队查找有关患者的信息&#xff0c;控制各种视频源到不同监视器的路由&#xff0c;录制视频&#xff0c;拍摄照片/剧照。 …

netbeans代码提示_NetBeans可用性提示

netbeans代码提示的Java IDE都来了&#xff0c;因为在很长的路要走天的JBuilder的 &#xff08;尽管JBuilder中似乎是一个值得欢迎提前在时间&#xff09;。 当今的Java IDE&#xff08;例如NetBeans &#xff0c; Eclipse &#xff0c; IntelliJ IDEA和JDeveloper &#xff09…

推荐文章:机器学习:“一文读懂机器学习,大数据/自然语言处理/算法全有了...

PS:文章主要转载自CSDN大神"黑夜路人"的文章: http://blog.csdn.NET/heiyeshuwu/article/details/43483655 本文主要对机器学习进行科普,包括机器学习的定义、范围、方法,包括机器学习的研究领域&#xff1a;模式识别、计算机视觉、语音识别、自然语言…

java比较炫的登录界面_html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面...

承蒙各位小伙伴的支持&#xff0c;鄙人有幸入围了《CSDN 2020博客之星》的前200名&#xff0c;现在进入投票环节&#xff0c;如果我平时写的文章和分享对你有用的话&#xff0c;请每天点击一下这个链接&#xff0c;投上你们宝贵的一票吧&#xff01;谢谢&#xff01;❤️ 每一票…

OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分

1.简介 在第一个教程中&#xff0c;我们创建了一个基本的OpenMap GIS应用程序&#xff0c;该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在该教程中&#xff0c;我们使用了以下OpenMap类&#x…

java rx.observable_Rxjava2 Observable的条件操作符详解及实例

简要&#xff1a;需求了解&#xff1a;在使用 Rxjava 开发中&#xff0c;经常有一些各种条件的操作 &#xff0c;如比较两个 Observable 谁先发射了数据、跳过指定条件的 Observable 等一系列的条件操作需求&#xff0c;那么很幸运&#xff0c; Rxjava 中已经有了很多条件操作符…

Linux poll 和 select 机制

poll select 介绍 使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个 或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来 读或写.…