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

    写在最后

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

     相关推荐:

  • 相关阅读:
    go 代理
    mongo创建用户
    博客搬家&留言板
    noip2020 SD选手迷惑行为大赏
    noip2020游记
    P4174 [NOI2006] 最大获利
    P3327 [SDOI2015]约数个数和
    P5069 [Ynoi2015]纵使日薄西山
    P3747 相逢是问候
    HDE6315 Naive Operations
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/14156070.html
Copyright © 2020-2023  润新知