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的方法入参有效。
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/14156070.html