小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

打破你的認(rèn)知!Java空指針居然還能這樣玩,90%人不知道…

 我是天選小丑 2020-08-06

相信在座的各位都遇到過空指針異常,不甚其煩,本文不是教你避免空指針,而是一些對空指針其他方面的理解。

本文可能有點(diǎn)另類,也可能會打破你對空指針的認(rèn)知。

1、null.method() 空指針?

我們知道調(diào)用一個(gè)對象的方法,如果對象為 null 肯定會報(bào)空指針錯(cuò)誤的,但你確定一定會嗎?

不一定!

來看下面的示例:

/**
* 訪問靜態(tài)方法
* @from 頭條公眾號:Java架構(gòu)技術(shù)劍
*/
private static void test() {
NullTest nullTest = null;
// hello
nullTest.test1('hello');
}
/**
* @from 頭條公眾號:Java架構(gòu)技術(shù)劍
* 關(guān)注獲取更多好玩的 Java 技術(shù)干貨
*/
private static void test1(String text) {
System.out.println(text);
}

如果 null 對象指向該類型的靜態(tài)方法,不但不會報(bào)空指針錯(cuò)誤,而且還會運(yùn)行正常,是不是很6?

因?yàn)殪o態(tài)方法不屬于任何對象,它屬于類本身的,相當(dāng)于直接調(diào)用類的靜態(tài)方法。

2、拆箱空指針

是的,大家要注意拆箱引發(fā)的空指針風(fēng)險(xiǎn),不知道的趕緊往下看,來看下面的例子:

/**
* 拆箱
* @from 頭條公眾號: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ā)手冊》中也提到了,鏈接里面舉了三目運(yùn)算符拆箱時(shí)的空指針問題,沒看過的可以點(diǎn)進(jìn)去看,這里就不具體展開了。獲取這份最新開發(fā)手冊,請關(guān)注我,私信回復(fù) “手冊”

3、運(yùn)算符空指針

大家要注意了,運(yùn)算符使用不當(dāng)也會引發(fā)空指針異常,來看下面的例子:

/**
* 運(yùn)算符
* @from 頭條公眾號: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)算符比較是否相等不會有問題,但使用 > < & 等需要計(jì)算的運(yùn)算符就會引起空指針異常。

4、xxx == null引發(fā)空指針?

經(jīng)??床┛突蛘呱磉叺耐抡f,字符串比較,常量要放前面,為了避免空指針風(fēng)險(xiǎn),這個(gè)對于equals 來說確實(shí)要這樣寫。

但是,居然還有人說,甚至也有很多人也是這么在寫, == 比較,null 也要放前面,這也是為了避免空指針?還是為了避免啥風(fēng)險(xiǎn)?

首先要搞清楚為什么有 null == xxx 這個(gè)寫法?

這個(gè)寫法的初衷是 C++ 為了避免邏輯錯(cuò)誤的,因?yàn)?C++ 寫 if(xxx = NULL) 是不會報(bào)編譯錯(cuò)誤的(變量賦值,永遠(yuǎn)為真),而寫 if(NULL = xxx) 是會有編譯錯(cuò)誤的。

所以在 C++ 建議把 NULL 放在前面,是為了避免程序員把 == 寫成 = 引起的邏輯錯(cuò)誤的。

而在 Java 里面,if(xxx = null) 是有編譯錯(cuò)誤提示的:

所以 Java 中不會出現(xiàn) C++ 的沒有編譯提示而導(dǎo)致的邏輯問題,所以 Java 中的 xxx == null 和 null == xxx 是等價(jià)的,null 放前面也是沒有任何意義的。

我們甚至還可以在 Java 中寫 null == null 的判斷,這也是 OK 的,完全沒問題的。

下面是完整的示例:

/**
* 運(yùn)算符
* @from 頭條公眾號: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 會發(fā)生空指針異常么?

不會!

來看下面的示例:

/**
* instanceof
* @from 頭條公眾號: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不是任何對象的引用。

總結(jié)

好了,今天LZ的分享就到這了,又漲姿勢了吧?

大家還知道哪些空指針的騷操作?歡迎留言分享哦!~

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多