java 抛异常 jvm_邪恶的Java技巧使JVM忘记检查异常

java 抛异常 jvm

我长期以来一直在批评Java中编译器检查异常的机制。 无论您是爱还是恨,都可以肯定一件事:在某些情况下,您不想与他们打交道。 Java中的解决方案是将一个检查后的异常包装在new RuntimeException(e)但这可以提供较长的堆栈跟踪,而无需添加有用的信息。 有时,我们只想告诉编译器冷静。

事实证明,通过对Java泛型的类型擦除错误功能的某些不当使用,这是有可能的。 实际操作对理解Java的内部运作方式具有指导意义。 我们走吧!

这是我们想要的:

public static void main(String[] args) {businessLogic();}private static void businessLogic() {List<String> configuration = readConfigurationFile();System.out.println(configuration.get(0));}private static List<String> readConfigurationFile() {try {return Files.readAllLines(Paths.get("non", "existing", "file"));} catch (IOException e) {throw softenException(e);}}

注意, businessLogic()既不捕获IOException也不声明它throws IOException 。 相反, softenException()方法将删除异常的检查。 运行它时,我们得到以下堆栈跟踪:

Exception in thread "main" java.nio.file.NoSuchFileException: non\existing\fileat sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230)at java.nio.file.Files.newByteChannel(Files.java:361)at java.nio.file.Files.newByteChannel(Files.java:407)at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)at java.nio.file.Files.newInputStream(Files.java:152)at java.nio.file.Files.newBufferedReader(Files.java:2784)at java.nio.file.Files.readAllLines(Files.java:3202)at java.nio.file.Files.readAllLines(Files.java:3242)at insanejava.SoftenExceptionsDemo.readConfigurationFile(SoftenExceptionsDemo.java:21)at insanejava.SoftenExceptionsDemo.businessLogic(SoftenExceptionsDemo.java:15)at insanejava.SoftenExceptionsDemo.main(SoftenExceptionsDemo.java:11)

! 在main方法中引发的异常是NoSuchFileException ,它是IOException的子类–已检查的异常! 怎么可能? 为什么程序中的任何方法都不必声明throws IOException

这是窍门:

private static RuntimeException softenException(Exception e) {return checkednessRemover(e);}private static <T extends Exception> T checkednessRemover(Exception e) throws T {throw (T) e;}

checkednessRemover方法使用了一个技巧,可以揭示有关Java内部工作的一些信息。 首先,将通用类型参数T绑定到RuntimeException ,以实现softenException 。 这意味着表达式throws T变成throws RuntimeException ,编译器将其解释为好像没有抛出异常。

但是语句throw (T)e; 理论上应该评估为throw (RuntimeException)e; 。 由于e是NoSuchFileException ,因此您希望此语句导致ClassCastException 。 但是,泛型在Java中的工作方式是,编译器会删除类型信息。 因此,字节码改为throw (Exception)e; ,这很好。

因此,这个奇怪的技巧表明Java编译器从编译的代码中删除了通用信息,而检查的异常纯粹是编译器的功能。 没有检查异常的运行时验证。

我会建议在生产代码中使用此技巧吗? 我不知道。 这很奇怪,可能没什么用,但是当我感到邪恶时,我会自己使用它。 如果没有别的,我希望学习可以让您对Java的内部运作有一些见解。

免责声明 :(1)我在其他地方读到了这个技巧,但是我再也找不到源了。 我以为这是Heinz Kabutz出色的Java专家 通讯,但我找不到源。 (2)这在 Lombok项目中 也实现为@SneakyThrows 。 如果您使用的是Lombok,则在任何情况下都不应重新实现此博客中的技巧。 请改用@SneakyThrows

翻译自: https://www.javacodegeeks.com/2018/05/a-wicked-java-trick-to-make-the-jvm-forget-to-check-exceptions.html

java 抛异常 jvm

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

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

相关文章

java空文本_输出到文本文件,控制台为空-Java

首先,您必须创建一个从OutputStream接口继承的类以实现适配器模式(我不确定是否是adapter)那么您可以使用该类作为波纹管主要PrintStream finalStream;TreeOutputStream tos;PrintStream out;out new PrintStream("logs.txt");tos new TreeOutputStream();tos.add(…

Linux 组合命令/命令组合的符号

在 EX 命令中&#xff0c;竖直线 | 是命令的分割符&#xff0c;它允许用户把多个命令组合在一起执行Shell 命令使用分号 ; 组合命令

混合多云架构_使用混合多云每个人都应避免的3个陷阱(第4部分)

混合多云架构每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0c;您都被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程&…

Linux 中常见的较为复杂的命令实例

文章目录 命令 find 和命令 grep 联合使用命令 find 和 命令 convert 联合使用命令 find 和命令 rm 联合使用命令 find 和命令 xargs 联合使用命令 sed 和目录 grep 联合使用命令 find 和命令 grep 联合使用 [root@htlwk0001host test]# find . -name "*.txt" -exec…

mysql 触发器 注意事项_MySQL触发器的利弊-使用MySQL触发器时应该注意的事项

在&#xff2d;ySQL中&#xff0c;触发器可以在你执行INSERT、UPDATE或DELETE的时候&#xff0c;执行一些特定的操作。在创建触发器时&#xff0c;可以指定是在执行SQL语句之前或是之后执行这些操作。通过触发器&#xff0c;你可以实现一些业务逻辑或一些数据限制&#xff0c;在…

混合多云架构_使用混合多云每个人都应避免的3个陷阱(第2部分)

混合多云架构如果您已经完全控制了本地数据中心&#xff0c;但又不能停止利用和支付过多的资源&#xff0c;那么如何期望防止这些成本转嫁到您的云策略中呢&#xff1f; 每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0…

Linux 系统中用于在文件内查找指定的字符串的命令 -- grep/egrep/fgrep 的区别详解

文章目录一、命令介绍grepegrepfgrep二、正则表达式元字符扩展集三、POSIX 字符集一、命令介绍 grep 一种强大的文本搜索工具&#xff0c;用于在文件内查找指定的字符串&#xff0c;在不使用转义符的前提下支持基本的正则表达式来搜索文本&#xff0c;并把匹配的行打印出来。…

rest api封装调用_如何从云功能调用外部REST API

rest api封装调用在之前的博客文章中&#xff0c;我展示了如何创建您的第一个云功能 &#xff08;以及一个视频 &#xff09;。 您的云函数很可能需要调用外部REST API。 以下教程将向您展示如何创建此类功能&#xff08;非常简单&#xff09;。 登录到IBM Cloud帐户 点击目录…

SVN 版本控制的数据合并规则

文章目录自己的猜想文件名比对文本行比对事实是什么提交计划提交数据更新客户端版本库数据时&#xff0c;同名文件中文本行的数据比对规则自己的猜想 假设SVN服务端就存在一份最新版的文件 HF&#xff0c;客户端检出这份文件后再提交&#xff0c;当前用户提交的文件称为 NF。 …

java算术运算符的分类_6.Java算术运算符

1.算术运算符的分类:算术运算符:* :( 正数&#xff0c;加法 ,连接符)* 连接符: 如果数据和字符串连接一起就是用了"",那么""就成了连接符,拼接字符串* 任何数据与字符串使用连接符那么结果的数据类型都是字符串类型* 任何数据和数据相加就是做加法…

java项目教训_[免费电子书]分析超过600,000个Java项目的经验教训

java项目教训建立明智的错误处理工作流程需要什么&#xff1f; 调查和解决生产中的应用程序错误对于维持性能和可靠性至关重要。 但是&#xff0c;这并不意味着要花很多时间。 要理解为什么在生产中的故障排除&#xff0c;可这样的头痛&#xff0c;我们开始发现“真理”我们经…

MacOS 的软件包管理工具 MacPorts

MacPorts 就像 Homebrew 一样&#xff0c;可以管理 MacOS 的软件包&#xff0c;和 Linux 系统下的 apt-get、yum 一样。 官方网址&#xff1a;https://www.macports.org/index.php

java plus方法_Java.math.BigDecimal.plus()方法实例

全屏Java.math.BigDecimal.plus()方法实例java.math.BigDecimal.plus() 返回一个BigDecimal&#xff0c;其值是 (this)&#xff0c;并且其刻度为是 this.scale().这种方法&#xff0c;它只是返回此BigDecimal是包括对称性与一元减号方法negate()。声明以下是java.math.BigDecim…

java jdk设置字符集_使用JDK 11在Java字符串上的新方法

java jdk设置字符集Java的String类似乎将在JDK 11中获得一些新方法&#xff0c;该方法将于2018年9月发布。 错误号 错误标题 新的String方法 描述 JDK-8200425 字符串::行 lines() “使用专用的分隔符从源字符串中懒散地提供行的字符串实例方法。” JDK-8200378 Stri…

MacOS 如何安装 SVN 命令终端

I purchased a new Mac running Mac OS X v10.8.5 (Mountain Lion). I’ve seen it written in various places that SVN is installed on OS X by default, but when I open a terminal and type which svn the program is not found. I’ve also run find / -name svn to che…

java代码审计ssrf危险函数_某租车系统Java代码审计之后台注入漏洞分析

CMS简介系统基于租车业务场景而搭建的O2O服务平台&#xff0c;可为用户提供商务租车、接送机、旅游租车、企业租车、自驾租车、婚庆用车等自助租车服务。系统包含车辆库管理、门店管理、员工管理、司机管理、订单管理、活动管理、评价管理、财务管理、统计等。部署简介1、下载代…

docker jib_Jib –为Spring Boot应用程序构建docker映像

docker jib使用Jib为示例Spring Boot应用程序创建docker映像是如此容易&#xff0c;这让我感到惊喜。 让我首先将Jib与以前使用的方法进行对比。 我正在使用bmuschko出色的gradle-docker插件创建docker映像。 如果可以访问docker守护进程以及基于dockerfile或直接Dockerfile的…

如何在 MacOS 环境下搭建 SVN 服务端环境

文章目录在服务端创建资源仓库资源仓库访问权限配置给资源仓库添加用户配置用户组及用户的权限启动 SVN 服务器停止 SVN 服务器SVN 是一个使用十分广泛的开放源代码的版本控制系统。在 Windows 系统下&#xff0c;我们一般使用 TortoiseSVN 来搭建 SVN 环境。而 MacOS 系统我们…

java 飞行记录器_Java 11功能– Java飞行记录器

java 飞行记录器在本文中&#xff0c;我们将看到如何利用Java Flight Recorder功能作为Java 11的一部分。之前&#xff0c;它是商业功能之一。 但是&#xff0c;对于带有JEP 328的 Java 11&#xff0c;它是开源的。 Java Flight Recorder将OS和JVM事件记录到一个文件中&#xf…

mysql管理节点_MySql节点管理安装步骤需要在SerA和SerB上各做一次

对大家推荐很好使用的MySql节点系统&#xff0c;像让大家对MySql节点系统有所了解&#xff0c;然后对MySql节点系统全面讲解介绍&#xff0c;希望对大家有用在向大家详细介绍MySql节点之前&#xff0c;首先让大家了解下MySql节点&#xff0c;然后全面介绍MySql节点&#xff0c;…