zoukankan      html  css  js  c++  java
  • 打破你的认知!Java空指针居然还能这样玩,90%人不知道…

    相信在座的各位都遇到过空指针异常,不甚其烦,本文不是教你避免空指针,而是一些对空指针其他方面的理解。

    本文可能有点另类,也可能会打破你对空指针的认知。

    1、null.method() 空指针?

    我们知道调用一个对象的方法,如果对象为 null 肯定会报空指针错误的,但你确定一定会吗?

    不一定!

    来看下面的示例:

    /**
     * 访问静态方法
     * @from 微信公众号:Java技术栈
     */
    private static void test() {
        NullTest nullTest = null;
    
        // hello
        nullTest.test1("hello");
    }
    
    /**
     * @from 微信公众号:Java技术栈
     * 关注获取更多好玩的 Java 技术干货
     */
    private static void test1(String text) {
        System.out.println(text);
    }
    

    如果 null 对象指向该类型的静态方法,不但不会报空指针错误,而且还会运行正常,是不是很6?

    因为静态方法不属于任何对象,它属于类本身的,相当于直接调用类的静态方法。

    2、拆箱空指针

    是的,大家要注意拆箱引发的空指针风险,不知道的赶紧往下看,来看下面的例子:

    /**
     * 拆箱
     * @from 微信公众号:Java技术栈
     */
    private static void test() {
        Integer i = null;
    
        // //NullPointerException
        int ii = i;
    
        System.out.println(ii);
    }
    

    拆箱如果为 null 时,引发空指针错误。

    这个在最新的《阿里巴巴开发手册》中也提到了,链接里面举了三目运算符拆箱时的空指针问题,没看过的可以点进去看,这里就不具体展开了。获取这份最新开发手册,请在公众号Java技术栈回复手册。

    3、运算符空指针

    大家要注意了,运算符使用不当也会引发空指针异常,来看下面的例子:

    /**
     * 运算符
     * @from 微信公众号:Java技术栈
     */
    private static void test5() {
        Integer i = null;
        Integer j = null;
    
        // true
        System.out.println(i == j);
    
        // false
        System.out.println(i != j);
    
        // NullPointerException
        System.out.println(i > j);
    
        // NullPointerException
        System.out.println(i < j);
    
        //NullPointerException
        System.out.println(i & j);
    }
    

    例子很明显吧,使用 ==!= 运算符比较是否相等不会有问题,但使用 > < & 等需要计算的运算符就会引起空指针异常。

    4、xxx == null引发空指针?

    经常看博客或者身边的同事说,字符串比较,常量要放前面,为了避免空指针风险,这个对于 equals 来说确实要这样写。

    但是,居然还有人说,甚至也有很多人也是这么在写, == 比较,null 也要放前面,这也是为了避免空指针?还是为了避免啥风险?

    首先要搞清楚为什么有 null == xxx 这个写法?

    这个写法的初衷是 C++ 为了避免逻辑错误的,因为 C++if(xxx = NULL) 是不会报编译错误的(变量赋值,永远为真),而写 if(NULL = xxx) 是会有编译错误的。

    所以在 C++ 建议把 NULL 放在前面,是为了避免程序员把 == 写成 = 引起的逻辑错误的。

    而在 Java 里面,if(xxx = null) 是有编译错误提示的:

    所以 Java 中不会出现 C++ 的没有编译提示而导致的逻辑问题,所以 Java 中的 xxx == nullnull == xxx 是等价的,null 放前面也是没有任何意义的。

    我们甚至还可以在 Java 中写 null == null 的判断,这也是 OK 的,完全没问题的。

    下面是完整的示例:

    /**
     * 运算符
     * @from 微信公众号:Java技术栈
     */
    private static void test() {
        Integer i = null;
    
        // i is null
        if (null == i){
            System.out.println("i is null");
        }
    
        // i is null
        if (i == null){
            System.out.println("i is null");
        }
        
        // i == j
        Integer j = null;
        if (i == j){
            System.out.println("i == j");
        }
    
        // 编译错误
        if (i = null){
            System.out.println("i is null");
        }
    }
    

    有没有小伙伴也被这个说法迷糊过?

    5、null instanceof 空指针?

    null instanceof 会发生空指针异常么?

    不会!

    来看下面的示例:

    /**
     * instanceof
     * @from 微信公众号:Java技术栈
     */
    private static void test() {
        Integer i = null;
    
        // false
        if(i instanceof Number){
            System.out.println("true");
        } else {
            System.out.println("false");
        }
        
        // false
        if(null instanceof Number){
            System.out.println("true");
        } else {
            System.out.println("false");
        }
    }
    

    如果为 null, instanceof 右边可以是任意引用类型,但结果始终输出 false,因为 null 不是任何对象的引用。

    总结

    好了,今天栈长的分享就到这了,又涨姿势了吧?

    另外,之前这篇《避免空指针的 5 个案例》也不错的,没看过的值得阅读一下。

    大家还知道哪些空指针的骚操作?欢迎留言分享哦!~

    最后,感谢阅读,原创不易,各位老铁们,给个在看、转发下吧!

    推荐去我的博客阅读更多:

    1.Java JVM、集合、多线程、新特性系列教程

    2.Spring MVC、Spring Boot、Spring Cloud 系列教程

    3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

    4.Java、后端、架构、阿里巴巴等大厂最新面试题

    觉得不错,别忘了点赞+转发哦!

  • 相关阅读:
    Log4j详细介绍(五)----输出地Appender
    Java抽象类与接口的区别
    深入理解Java的接口和抽象类
    小程序
    小程序
    小程序
    CMS
    CMS
    微信小程序
    微信小程序
  • 原文地址:https://www.cnblogs.com/javastack/p/13444370.html
Copyright © 2011-2022 走看看