宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見(jiàn)問(wèn)題
產(chǎn)品動(dòng)態(tài)
精選推薦

Java 8 中避免 Null 檢查

管理 管理 編輯 刪除

如何預(yù)防 Java 中著名的 NullPointerException 異常?這是每個(gè) Java 初學(xué)者遲早會(huì)問(wèn)到的關(guān)鍵問(wèn)題之一。而且中級(jí)和高級(jí)程序員也在時(shí)時(shí)刻刻規(guī)避這個(gè)錯(cuò)誤。其是迄今為止 Java 以及很多其他編程語(yǔ)言中最流行的一種錯(cuò)誤。

Null 引用的發(fā)明者 Tony Hoare 在 2009 年道歉,并稱(chēng)這種錯(cuò)誤為他的十億美元錯(cuò)誤。

我將其稱(chēng)之為自己的十億美元錯(cuò)誤。它的發(fā)明是在1965 年,那時(shí)我用一個(gè)面向?qū)ο笳Z(yǔ)言(ALGOL W)設(shè)計(jì)了第一個(gè)全面的引用類(lèi)型系統(tǒng)。我的目的是確保所有引用的使用都是絕對(duì)安全的,編譯器會(huì)自動(dòng)進(jìn)行檢查。但是我未能抵御住誘惑,加入了 Null 引用,僅僅是因?yàn)閷?shí)現(xiàn)起來(lái)非常容易。它導(dǎo)致了數(shù)不清的錯(cuò)誤、漏洞和系統(tǒng)崩潰,可能在之后 40 年中造成了十億美元的損失。

無(wú)論如何,我們必須要面對(duì)它。所以,我們到底能做些什么來(lái)防止 NullPointerException 異常呢?那么,答案顯然是對(duì)其添加 null 檢查。由于 null 檢查還是挺麻煩和痛苦的,很多語(yǔ)言為了處理 null 檢查添加了特殊的語(yǔ)法,即空合并運(yùn)算符 —— 其在像 Groovy 或 Kotlin 這樣的語(yǔ)言中也被稱(chēng)為 Elvis 運(yùn)算符。

不幸的是 Java 沒(méi)有提供這樣的語(yǔ)法糖。但幸運(yùn)的是這在 Java 8 中得到了改善。這篇文章介紹了如何利用像 lambda 表達(dá)式這樣的 Java 8 新特性來(lái)防止編寫(xiě)不必要的 null 檢查的幾個(gè)技巧。

在 Java 8 中提高 Null 的安全性

在另一篇文章中說(shuō)明了我們可以如何利用 Java 8 的 Optional 類(lèi)型來(lái)預(yù)防 null 檢查。下面是那篇文章中的示例代碼。

假設(shè)我們有一個(gè)像這樣的類(lèi)層次結(jié)構(gòu):

class Outer {
    Nested nested;
    Nested getNested() {
        return nested;
    }
}
class Nested {
    Inner inner;
    Inner getInner() {
        return inner;
    }
}
class Inner {
    String foo;
    String getFoo() {
        return foo;
    }
}

解決這種結(jié)構(gòu)的深層嵌套路徑是有點(diǎn)麻煩的。我們必須編寫(xiě)一堆 null 檢查來(lái)確保不會(huì)導(dǎo)致一個(gè) NullPointerException:

Outer outer = new Outer();
if (outer != null && outer.nested != null && outer.nested.inner != null) {
    System.out.println(outer.nested.inner.foo);
}

我們可以通過(guò)利用 Java 8 的 Optional 類(lèi)型來(lái)擺脫所有這些 null 檢查。map 方法接收一個(gè) Function 類(lèi)型的 lambda 表達(dá)式,并自動(dòng)將每個(gè) function 的結(jié)果包裝成一個(gè) Optional 對(duì)象。這使我們能夠在一行中進(jìn)行多個(gè) map 操作。Null 檢查是在底層自動(dòng)處理的。

Optional.of(new Outer())
    .map(Outer::getNested)
    .map(Nested::getInner)
    .map(Inner::getFoo)
    .ifPresent(System.out::println);

還有一種實(shí)現(xiàn)相同作用的方式就是通過(guò)利用一個(gè) supplier 函數(shù)來(lái)解決嵌套路徑的問(wèn)題:

Outer obj = new Outer();
resolve(() -> obj.getNested().getInner().getFoo());
    .ifPresent(System.out::println);

調(diào)用 obj.getNested().getInner().getFoo()) 可能會(huì)拋出一個(gè) NullPointerException 異常。在這種情況下,該異常將會(huì)被捕獲,而該方法會(huì)返回 Optional.empty()。

public static <T> Optional<T> resolve(Supplier<T> resolver) {
    try {
        T result = resolver.get();
        return Optional.ofNullable(result);
    }
    catch (NullPointerException e) {
        return Optional.empty();
    }
}

請(qǐng)記住,這兩個(gè)解決方案可能沒(méi)有傳統(tǒng) null 檢查那么高的性能。不過(guò)在大多數(shù)情況下不會(huì)有太大問(wèn)題。

像往常一樣,上面的示例代碼都托管在 GitHub。

祝編程愉快!


請(qǐng)登錄后查看

Lily jar 最后編輯于2024-12-26 16:31:38

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無(wú)簡(jiǎn)介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
625
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見(jiàn)問(wèn)題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁(yè)頭條 首頁(yè)動(dòng)態(tài) 首頁(yè)推薦
取 消 確 定
回復(fù)
回復(fù)
問(wèn)題:
問(wèn)題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢(xún)熱線 咨詢(xún)熱線

400-8888-794

微信掃碼咨詢(xún)

CRMEB開(kāi)源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服