您的位置:首页 > 编程语言 > Java开发

打破你的认知!Java空指针居然还能这样玩,90%人不知道…

2020-08-06 09:44 579 查看

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

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

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 技术~

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

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

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

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

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

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

最后,关注下面的栈长的微信公众号:Java技术栈,回复:福利,可以免费获取一份我整理的 2020 最新 Java 面试题,真的非常全(含答案),无任何套路。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐