Unchecked将 Java 的检查出异常”破解为“未检查出任何异常Exception”。
当你遭遇Exception异常时,你需要使用try{}捕获处理这个异常,或者将这个异常依然抛出,只有这两种选择。
这两种选择都不好,首先使用try{}捕获异常,那么就需要涉及一些业务逻辑的处理,你可能需要检查一下你调用代码的API,或源代码,研究它为什么抛出异常,这让你偏离你自己正在展开的业务逻辑处理。
照常抛出异常,好像是一种不负责任,使得你得代码造成隐患。
当然,抛出异常最影响的是函数式编程,如下:
List.of("LICENSE", "README.md", "Unchecked.java").stream()
.map(file -> {
**try** {
**return**(file + ": " + Files.lines(Paths.get(file)).count());
} **catch** (IOException e) {
**throw** **new** RuntimeException(e); _// java made me do it_ }
})
.toList();
在stream这个流的函数式操作中,你需要使用try来捕获异常,是不是很滑稽?
使用了这个Unchecked Java以后,你的代码就变成真正流式函数式代码:
List.of("LICENSE", "README.md", "Unchecked.java").stream()
.map(file -> file + ": " + Files.lines(Paths.get(file)).count())
.toList();
当您无法处理已检查的异常时,通常的做法是将其作为RuntimeException重新抛出。
这种做法除了代码污染外,这样做的问题是异常的根本原因被隐藏起来,有时如果开发人员忘记保留它,异常就会丢失。
使用这个Unchecked Java开源项目,封装已检查异常不再是必要的。异常将被传回调用栈。
Unchecked Java开源项目不会对字节码进行任何修改。这是因为JVM不知道已检查异常。
一直以来都是编译器在捣鬼。
使用依赖:
<dependency>
<groupId>io.github.rogerkeays</groupId>
<artifactId>unchecked</artifactId>
<version>0.4.2</version>
<scope>compile</scope>
</dependency>
配置编译插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<compilerArgs>
<arg>-Xplugin:unchecked</arg>
<arg>-J--add-opens=java.base/java.lang=ALL-UNNAMED</arg>
</compilerArgs>
<fork>**true**</fork>
...
</configuration>
</plugin>
注意,旧版本的编译器插件使用不同的语法。详情请参考Maven编译器插件文档。确保添加true选项。
要添加nowarn参数,使用-Xplugin:unchecked nowarn。
目前支持:
- jdk-09.0.4
- jdk-10.0.2
- jdk-11.0.8
- jdk-12.0.2
- jdk-13.0.2
- jdk-14.0.2
- jdk-15.0.2
- jdk-16.0.2
- jdk-17.0.2
- jdk-18.0.2.1
- jdk-19.0.2
- jdk-20.0.1
- jdk-21 (early access)
- jdk-22 (early access)
为确保与现有代码的向后兼容性,Unchecked被用于编译和测试以下开源项目:
开源项目: github.com/rogerkeays/…
更多函数式编程:www.jdon.com/tag-10341/