相信在座的各位都遇到過空指針異常,不甚其煩,本文不是教你避免空指針,而是一些對(duì)空指針其他方面的理解。
本文可能有點(diǎn)另類,也可能會(huì)打破你對(duì)空指針的認(rèn)知。
1、null.method() 空指針?
我們知道調(diào)用一個(gè)對(duì)象的方法,如果對(duì)象為 null 肯定會(huì)報(bào)空指針錯(cuò)誤的,但你確定一定會(huì)嗎?
不一定!
來看下面的示例:
/**
* 訪問靜態(tài)方法
* @from 頭條公眾號(hào):Java架構(gòu)技術(shù)劍
*/
private static void test() {
NullTest nullTest = null;
// hello
nullTest.test1('hello');
}
/**
* @from 頭條公眾號(hào):Java架構(gòu)技術(shù)劍
* 關(guān)注獲取更多好玩的 Java 技術(shù)干貨
*/
private static void test1(String text) {
System.out.println(text);
}
如果 null 對(duì)象指向該類型的靜態(tài)方法,不但不會(huì)報(bào)空指針錯(cuò)誤,而且還會(huì)運(yùn)行正常,是不是很6?
因?yàn)殪o態(tài)方法不屬于任何對(duì)象,它屬于類本身的,相當(dāng)于直接調(diào)用類的靜態(tài)方法。
2、拆箱空指針
是的,大家要注意拆箱引發(fā)的空指針風(fēng)險(xiǎn),不知道的趕緊往下看,來看下面的例子:
/**
* 拆箱
* @from 頭條公眾號(hào):Java架構(gòu)技術(shù)劍
*/
private static void test() {
Integer i = null;
// //NullPointerException
int ii = i;
System.out.println(ii);
}
拆箱如果為 null 時(shí),引發(fā)空指針錯(cuò)誤。
這個(gè)在最新的《阿里巴巴開發(fā)手冊(cè)》中也提到了,鏈接里面舉了三目運(yùn)算符拆箱時(shí)的空指針問題,沒看過的可以點(diǎn)進(jìn)去看,這里就不具體展開了。獲取這份最新開發(fā)手冊(cè),請(qǐng)關(guān)注我,私信回復(fù) “手冊(cè)”
3、運(yùn)算符空指針
大家要注意了,運(yùn)算符使用不當(dāng)也會(huì)引發(fā)空指針異常,來看下面的例子:
/**
* 運(yùn)算符
* @from 頭條公眾號(hào):Java架構(gòu)技術(shù)劍
*/
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);
}
例子很明顯吧,使用 ==、!= 運(yùn)算符比較是否相等不會(huì)有問題,但使用 > < & 等需要計(jì)算的運(yùn)算符就會(huì)引起空指針異常。
4、xxx == null引發(fā)空指針?
經(jīng)??床┛突蛘呱磉叺耐抡f,字符串比較,常量要放前面,為了避免空指針風(fēng)險(xiǎn),這個(gè)對(duì)于equals 來說確實(shí)要這樣寫。
但是,居然還有人說,甚至也有很多人也是這么在寫, == 比較,null 也要放前面,這也是為了避免空指針?還是為了避免啥風(fēng)險(xiǎn)?
首先要搞清楚為什么有 null == xxx 這個(gè)寫法?
這個(gè)寫法的初衷是 C++ 為了避免邏輯錯(cuò)誤的,因?yàn)?C++ 寫 if(xxx = NULL) 是不會(huì)報(bào)編譯錯(cuò)誤的(變量賦值,永遠(yuǎn)為真),而寫 if(NULL = xxx) 是會(huì)有編譯錯(cuò)誤的。
所以在 C++ 建議把 NULL 放在前面,是為了避免程序員把 == 寫成 = 引起的邏輯錯(cuò)誤的。
而在 Java 里面,if(xxx = null) 是有編譯錯(cuò)誤提示的:
所以 Java 中不會(huì)出現(xiàn) C++ 的沒有編譯提示而導(dǎo)致的邏輯問題,所以 Java 中的 xxx == null 和 null == xxx 是等價(jià)的,null 放前面也是沒有任何意義的。
我們甚至還可以在 Java 中寫 null == null 的判斷,這也是 OK 的,完全沒問題的。
下面是完整的示例:
/**
* 運(yùn)算符
* @from 頭條公眾號(hào):Java架構(gòu)技術(shù)劍
*/
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');
}
// 編譯錯(cuò)誤
if (i = null){
System.out.println('i is null');
}
}
有沒有小伙伴也被這個(gè)說法迷糊過?
5、null instanceof 空指針?
null instanceof 會(huì)發(fā)生空指針異常么?
不會(huì)!
來看下面的示例:
/**
* instanceof
* @from 頭條公眾號(hào):Java架構(gòu)技術(shù)劍
*/
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 右邊可以是任意引用類型,但結(jié)果始終輸出 false,因?yàn)?null不是任何對(duì)象的引用。
總結(jié)
好了,今天LZ的分享就到這了,又漲姿勢(shì)了吧?
大家還知道哪些空指針的騷操作?歡迎留言分享哦!~