Unchecked开源工具让你永远告别Java异常检查


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编译器插件文档。确保添加<fork>true</fork>选项。

要添加nowarn参数,使用<arg>-Xplugin:unchecked nowarn</arg>。

目前支持:

  • 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被用于编译和测试以下开源项目:

项目点击标题