java 編譯期非空校驗org.jetbrains.annotations


 

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的方法入參有效。 

 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM