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異常檢查