亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

在 Java 8 中避免 Null 檢查

ethernet / 780人閱讀

摘要:在中避免檢查原文譯者來源在中避免檢查如何預(yù)防中著名的異常這是每個(gè)初學(xué)者遲早會(huì)問到的關(guān)鍵問題之一。引用的發(fā)明者在年道歉,并稱這種錯(cuò)誤為他的十億美元錯(cuò)誤。但幸運(yùn)的是這在中得到了改善。檢查是在底層自動(dòng)處理的。

在 Java 8 中避免 Null 檢查

原文:Avoid Null Checks in Java 8

譯者:ostatsu

來源:在 Java 8 中避免 Null 檢查

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

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

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

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

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

在 Java 8 中提高 Null 的安全性

我已經(jīng)在另一篇文章中說明了我們可以如何利用 Java 8 的 Optional 類型來預(yù)防 null 檢查。下面是那篇文章中的示例代碼。

假設(shè)我們有一個(gè)像這樣的類層次結(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)麻煩的。我們必須編寫一堆 null 檢查來確保不會(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);
}

我們可以通過利用 Java 8 的 Optional 類型來擺脫所有這些 null 檢查。map 方法接收一個(gè) Function 類型的 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)相同作用的方式就是通過利用一個(gè) supplier 函數(shù)來解決嵌套路徑的問題:

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  Optional resolve(Supplier resolver) {
    try {
        T result = resolver.get();
        return Optional.ofNullable(result);
    }
    catch (NullPointerException e) {
        return Optional.empty();
    }
}

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

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

祝編碼愉快!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64966.html

相關(guān)文章

  • 別再寫 bug 了,避免空指針的 5 個(gè)案例!

    摘要:本文,棧長(zhǎng)將帶你了解什么是空指針,還有如何有效的避免空指針。如何避免空指針下面說幾個(gè)空指針的幾個(gè)最常見的案例及解決之道。字符串比較,常量放前面這個(gè)時(shí)候可能為造成空指針異常,應(yīng)該把常量放前面,就能避免空指針異常。 空指針是我們 Java 開發(fā)人員經(jīng)常遇到的一個(gè)基本異常,這是一個(gè)極其普遍但似乎又無法根治的問題。 本文,棧長(zhǎng)將帶你了解什么是空指針,還有如何有效的避免空指針。 什么是空指針? ...

    zzzmh 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第十章筆記(用Optional取代null

    摘要:是第一批在堆上分配記錄的類型語言之一。實(shí)際上,的這段話低估了過去五十年來數(shù)百萬程序員為修復(fù)空引用所耗費(fèi)的代價(jià)。很明顯,這種方式不具備擴(kuò)展性,同時(shí)還犧牲了代碼的可讀性。是目前程序開發(fā)中最典型的異常。完成這一任務(wù)有多種方法。 用Optional取代null 如果你作為Java程序員曾經(jīng)遭遇過NullPointerException,請(qǐng)舉起手。如果這是你最常遭遇的異常,請(qǐng)繼續(xù)舉手。非??上В?..

    flybywind 評(píng)論0 收藏0
  • Java8新特性總覽

    摘要:新特性總覽標(biāo)簽本文主要介紹的新特性,包括表達(dá)式方法引用流默認(rèn)方法組合式異步編程新的時(shí)間,等等各個(gè)方面。還有對(duì)應(yīng)的和類型的函數(shù)連接字符串廣義的歸約匯總起始值,映射方法,二元結(jié)合二元結(jié)合。使用并行流時(shí)要注意避免共享可變狀態(tài)。 Java8新特性總覽 標(biāo)簽: java [TOC] 本文主要介紹 Java 8 的新特性,包括 Lambda 表達(dá)式、方法引用、流(Stream API)、默認(rèn)方...

    mayaohua 評(píng)論0 收藏0
  • How to handle Null Pointer Exception(譯)

    摘要:我們應(yīng)該考慮使用字符串常量調(diào)用方法來代替使用對(duì)象調(diào)用該方法。然而如果我們通過字符串常量來調(diào)用方法,執(zhí)行流程會(huì)正常進(jìn)行檢查方法的參數(shù)在執(zhí)行方法的方法體之前,務(wù)必對(duì)方法的參數(shù)進(jìn)行值檢查。 原文地址作者 Sotirios-Efstathios (Stathis) Maneas譯者 smallcloverThanks for your watching! java.lang.NullPoine...

    MRZYD 評(píng)論0 收藏0
  • [譯] Java 最常見的 5 個(gè)錯(cuò)誤

    摘要:近日,在上列舉了開發(fā)中常見的個(gè)錯(cuò)誤,與君共免。在多線程中并發(fā)修改集合內(nèi)容是非常常見的,因此需要使用并發(fā)編程中常用的方法進(jìn)行處理,例如同步鎖對(duì)于并發(fā)修改采用特殊的集合等等。在單線程和多線程情況下解決這個(gè)問題有微小的差別。 在編程時(shí),開發(fā)者經(jīng)常會(huì)遭遇各式各樣莫名錯(cuò)誤。近日,Sushil Das 在 Geek On Java上列舉了 Java 開發(fā)中常見的 5 個(gè)錯(cuò)誤,與君共「免」。 原文...

    chemzqm 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<