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

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

原文地址:https://www.cnblogs.com/Marydon20170307/p/14156070.html