博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis使用$报空指针_打破你的认知!Java空指针居然还能这样玩,90%人不知道…...
阅读量:6269 次
发布时间:2019-06-22

本文共 2626 字,大约阅读时间需要 8 分钟。

文章来源:打破你的认知!Java空指针居然还能这样玩,90%人不知道…
原文作者:Java技术栈
来源平台:微信公众号

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

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

1、null.method() 空指针?

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

不一定!

来看下面的示例:

/** * 访问静态方法 */private static void test() {
NullTest nullTest = null; // hello nullTest.test1("hello");}/** */private static void test1(String text) {
System.out.println(text);

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

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

2、拆箱空指针

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

/** * 拆箱 */private static void test() {
Integer i = null; // //NullPointerException int ii = i; System.out.println(ii);

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

3、运算符空指针

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

/** * 运算符 */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) 是有编译错误提示的:

2246974e2658440462e57bdfbb671ed1.png

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

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

下面是完整的示例:

/** * 运算符 */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 */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不是任何对象的引用。

总结

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

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

转载地址:http://avspa.baihongyu.com/

你可能感兴趣的文章
spring mvc 基于注解 配置默认 handlermapping
查看>>
半小时学会上传本地项目到github
查看>>
Android学Jni/Ndk 开发记录(一)
查看>>
Linux Tcl和Expect的安装
查看>>
WPF中的依赖项属性(转)
查看>>
linux防火墙相关 iptables
查看>>
最简单的单例模式
查看>>
JPopupMenu的使用以及JPopupMenu中子组件的事件处理
查看>>
从反汇编的角度看引用和指针的区别
查看>>
拓马长枪定乾坤
查看>>
UIProgressView的详细使用
查看>>
Silverlight实用窍门系列:70.Silverlight的视觉状态组VisualStateGroup
查看>>
照片筛选与上传功能
查看>>
Hello ZED
查看>>
常见web攻击方式
查看>>
hdu 4472
查看>>
oracle存储过程中is和as区别
查看>>
windows 2003 群集
查看>>
几个gcc的扩展功能
查看>>
Spark一个简单案例
查看>>