本文主要是介绍Java空指针居然还能这样玩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
相信在座的各位都遇到过空指针异常,不甚其烦,本文不是教你避免空指针,而是一些对空指针其他方面的理解。
本文可能有点另类,也可能会打破你对空指针的认知。
1、null.method() 空指针?
我们知道调用一个对象的方法,如果对象为 null
肯定会报空指针错误的,但你确定一定会吗?
不一定!
来看下面的示例:
/*** 访问静态方法* @from 微信公众号:Java技术栈*/
private static void test() {NullTest nullTest = null;// hellonullTest.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;// //NullPointerExceptionint ii = i;System.out.println(ii);
}
拆箱如果为 null
时,引发空指针错误。
这个在最新的《阿里巴巴开发手册》中也提到了,链接里面举了三目运算符拆箱时的空指针问题,没看过的可以点进去看,这里就不具体展开了。获取这份最新开发手册,请在公众号Java技术栈回复手册。
3、运算符空指针
大家要注意了,运算符使用不当也会引发空指针异常,来看下面的例子:
/*** 运算符* @from 微信公众号:Java技术栈*/
private static void test5() {Integer i = null;Integer j = null;// trueSystem.out.println(i == j);// falseSystem.out.println(i != j);// NullPointerExceptionSystem.out.println(i > j);// NullPointerExceptionSystem.out.println(i < j);//NullPointerExceptionSystem.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 nullif (null == i){System.out.println("i is null");}// i is nullif (i == null){System.out.println("i is null");}// i == jInteger 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;// falseif(i instanceof Number){System.out.println("true");} else {System.out.println("false");}// falseif(null instanceof Number){System.out.println("true");} else {System.out.println("false");}
}
如果为 null
, instanceof
右边可以是任意引用类型,但结果始终输出 false
,因为 null
不是任何对象的引用。
这篇关于Java空指针居然还能这样玩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!