打破你的认知!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 == null和
null == 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 个案例》也不错的,没看过的值得阅读一下。
大家还知道哪些空指针的骚操作?欢迎留言分享哦!~
最后,感谢阅读,原创不易,各位老铁们,给个在看、转发下吧!
关注公众号Java技术栈回复 java 可以阅读往期干货,后面我也会陆续分享更多好玩的 Java 技术~
推荐去我的博客阅读更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
觉得不错,别忘了点赞+转发哦!
最后,关注下面的栈长的微信公众号:Java技术栈,回复:福利,可以免费获取一份我整理的 2020 最新 Java 面试题,真的非常全(含答案),无任何套路。
- Java 12 骚操作, 文件比对居然还能这样玩!
- 派生类地址比基类地址少4(子类与基类指针强行转换的时候,值居然会发生变化,不知道Delphi BCB是不是也这样) good
- 你不知道的冷知识:JSON.stringify 居然还能这样用?
- 毁三观!打破你对Java并发的认知!
- 在留学期间挂科本科不能顺利毕业,居然还能这样直接申请硕士
- 阿里云logo 技术小能手 如何降低90%Java垃圾回收时间?以阿里HBase的GC优化实践为例 前天 421 过去的一年里,我们准备在Ali-HBase上突破这个被普遍认知的痛点,为此进行了深度分
- Java 11 已发布,String 还能这样玩!
- 原来Java代码在DOS中是这样跑的!!!不知道你就OUT了!!!
- 这样吃橙子才最健康,90%的人不知道的秘密!
- Java中堆内存和栈内存_在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)。修改栈指针就可以把栈中的内容销毁.这样最快
- 原来IC是这样设计的,竟然90%的人都不知道!
- 行业预约网站居然还能这样玩?
- 居然还能这样——程序员加薪的新方法
- 90%的人都不知道Scanner String 方法这样用
- java定义一个方法时,不知道传入的方法的数量,可以这样定义
- 朋友外包干了5年java,居然不知道dubbo-monitor是怎么用的?
- 全中国99%的人都不知道,π居然可以这样求
- java研究一个简单的算法碰到这种输出,哎,以前还真没注意还能这样......
- delete后该指针还能使用么(转帖)
- JAVA classpath, 纠正我一直以来错误的认知