2016-11-28 174 views
37

我有一個函數具有以下簽名爲什麼在運行時檢查@Nonnull註釋?

public static String myFunction(@Nonnull String param) 

當我把它用PARAM爲空,我得到以下異常:

Caused by: java.lang.IllegalArgumentException: Argument for @Nonnull parameter 'param' of com/MyClass.myFunction must not be null 
    at com.MyClass.$$$reportNull$$$0(MyClass.java) 

javax.annotation.Nonnull應該不是在運行時進行檢查。

誰實際拋出異常,爲什麼?

P.S.我在調試模式下運行Tomcat服務器從IntelliJ IDEA的2016.3與Oracle JDK 1.8.0_102

+0

其實@Jesper,這些新的註解是這樣做的:在編譯時檢查事情。你可以檢查我的答案。「當你編譯代碼時,包括命令行中的NonNull模塊,如果編譯器檢測到潛在問題,編譯器會發出警告。」 – BrunoDM

+2

@BrunoDM - 它是運行時異常 – Dmitry

回答

58

當你編譯IntelliJ IDEA的項目,編譯類的工具它字節碼添加運行時檢查的@Nonnull標註各種口味。此行爲由選項控制:

設置|構建,執行,部署|編譯器| [x]爲非空註釋的方法和參數添加運行時斷言。

+1

在什麼版本的IDEA中功能被添加? – Dmitry

+3

此功能已添加到IntelliJ IDEA 5.0中,但當時它僅支持JetBrains的'@NotNull'註釋。最近添加了對其他註釋的支持。 – yole

+28

因此,奇妙的是編譯代碼與構建工具鏈不同。這在很多層面上都是錯誤的。例如,這可能會導致從IntelliJ運行時單元測試失敗,但通過maven運行時通過。也許用戶有一個空檢查和特定的異常拋出,單元測試驗證異常和消息,但是這會阻礙。 –