天天看點

Unchecked開源工具讓你永遠告别Java異常檢查

作者:解道Jdon

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被用于編譯和測試以下開源項目:

  • Apache Commons Lang
  • iText
  • Tomcat
  • Hibernate

項目點選:Unchecked開源工具讓你永遠告别Java異常檢查

繼續閱讀