1.情景展示
在java開發過程中,經常會遇到空指針異常,最普通的異常也是最惡心的報錯信息。如何盡可能地規避這種無用的異常,是我們一直努力的目標。
2.jetbrains
今天,來說一下idea的非空校驗注解。先說jetbrains公司jar包的特點:
第一,它只能校驗編譯階段的非空異常,另外,它只是進行非空提醒,不會報錯,即使你不根據提示修改,也不會影響代碼的正常編譯及運行,一會兒會舉例;
第二,不能校驗運行時的空指針異常(NPE);
這個其實是能理解,因為,即使是我們也不可能預料到所有運行期可能會觸發的空指針。
像這種,只能靠我們自己檢查出來,並加上非空校驗。
3.具體用法
准備工作
<!--非空校驗--> <dependency> <groupId>org.jetbrains</groupId> <artifactId>annotations</artifactId> <version>13.0</version> <scope>compile</scope> </dependency>
我們可以看到,該jar包的生效范圍是:compile,也就是只在編譯階段有效。
在項目中引入jar包,就能直接用啦;
說明:這個在idea里用着比較順手,若是在eclipse中也能使用,就是不太方便。
idea會自動檢測出來,當前類中有哪些方法會引發空指針的情況,並在可能導致空指針的方法入口所在行最左側(顯示行號的位置)出現@符號;
有這個就代表調用這個方法可能會觸發空指針,咱們把鼠標懸浮上去,提示信息如下:
意思是:第一個入參應該加上非空注解@NotNull
點擊左側這個@符號
再點一次,即可插入
這次,左側沒有@符號了,意思是:第一個參數key不能為空。
到這,我們思考下:為什么導致空指針?
因為變量還沒賦值就使用了(變量沒賦值的時候,它的值是NULL);
就像上面的例子,如果我們在調用的時候,第一個參數值傳NULL,必然會報空指針異常;
開篇,我提到了:jetbrains開發的非空注解,只做友好提示,即使你傳Null,它也不會報錯,不影響代碼執行。
idea會突出顯示該參數,鼠標懸浮會有一個這樣的提示:
注解@NotNull
作用:非空校驗
共有兩種使用方式:一種是用在方法入參,一種是用在方法上。
加在參數上
表明這個入參不能為空,因為下面沒有進行非空校驗 ,就直接使用了。
加在方法體上
表明這個方法的返回值不能為空,否則,返回值可能是NULL。
注解@Contract
使用條件:
方法入參>0;
有返回值(返回值不為void)。
說明:
下划線_,代表通配符,表示:參數可以為任意值;
一個下划線,代表一個入參,多個下划線之間使用逗號隔開,下划線的個數與參數個數保持一致;
->,指定返回值,表明方法的返回值;new表示創建一個對象,加起來就是:返回值是一個新的對象。
像這種沒有任何代碼,直接return的,會被加上pure=true,表明它是一個純函數,具體我也不懂。
這些注解,都是通過idea點擊@自動生成的。
目前就用到這些,其它的等遇到再說。
注解濫用
攔截器
像這種異常攔截器,加上非空校驗也沒有意義,因為只有當拋出的異常是綁定異常時,才會被捕獲到,進而調用該方法;
控制層方法
加上非空校驗也沒有意義,對於Controller而言,如果非要非空校驗,需要的是真正意義上的非空校驗:如果為空就直接跑出異常,不再進方法體;
而jetbrains的@NotNull,只是用來供我們自己使用時,給個提示罷了,不是真正意義上的非空校驗。
真的想用,就用javax包里的非空校驗注解
啟動類
這個位置加非空校驗,也毫無意義,因為它的調用並不是由我們發起的,何來控制非空,springboot能跑起來,那它就一定非空。
總之就是:
跟項目配置文件有關的方法不要用,用了也控制不住;
控制層,接口入口不要用,並不能進行非空校驗,要它有何用!
4.java原生非空注解
在方法上,即使用javax也沒有意義,不能起到真正意義上的非空校驗
運行起來,同樣會報空指針異常。
javax包下的校驗注解,只對Controller的方法入參有效。