欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java8新特性如何防止空指針異常

 更新時間:2023年08月09日 11:16:32   作者:蠟筆小新丶henry  
要說 Java 編程中哪個異常是你印象最深刻的,那 NullPointerException 空指針可以說是臭名昭著的,不要說初級程序員會碰到, 即使是中級,專家級程序員稍不留神,就會掉入這個坑里,本文就和大家聊聊Java8新特性如何防止空指針異常

Java8 新特性如何防止空指針異常

要說 Java 編程中哪個異常是你印象最深刻的,那 NullPointerException 空指針可以說是臭名昭著的。不要說初級程序員會碰到, 即使是中級,專家級程序員稍不留神,就會掉入這個坑里。

Null引用的發(fā)明者 Tony Hoare 曾在 2009 年作出道歉聲明,聲明中表示,到目前為止,空指針異常大約給企業(yè)已造成數(shù)十億美元的損失。

下面是 Tony Hoare 的原話:

我將 Null 引用的設(shè)計稱為是一個數(shù)十億美元的錯誤。1965 那年,我正在用面向?qū)ο笳Z言(ALGOL W) 設(shè)計首個功能全面的系統(tǒng)。當時我的考量是,確保所有被使用的引用都是安全的,編譯器會自動進行檢查。但是,我沒有抵住誘惑,加入了 Null 引用,僅僅是為了實現(xiàn)起來省事。這之后,它導致了數(shù)不清的 bug、錯誤和系統(tǒng)崩潰,也為企業(yè)導致了不可估量的損失。

事已至此,我們必須學會面對它。So, 我們要如何防止空指針異常呢?

唯一的辦法就是對可能為 Null 的對象添加檢查。但是 Null 檢查是繁瑣且痛苦的。所以一些比較新的語言為了處理 Null 檢查,特意添加了特殊的語法,如空合并運算符。

在 Groovy 或 Kotlin 這樣的語言中也被稱為 Elvis運算符。

不幸的是,在老版本的 Java 中并沒有提供這樣的語法糖。Java8 中在這方面做了改進。所以,這篇文章就特意來介紹一下如何在 Java8 中利用新特性來編寫防止 NullPointerException的發(fā)生。

Java8 中如何加強對 Null 對象的檢查?

接下來,我們細說一下如何通過 Optional 類來對對象做空校驗:

在業(yè)務(wù)系統(tǒng)中,對象中嵌套對象是經(jīng)常發(fā)生的場景,如下示例代碼:

?// 最外層對象
?class Outer {
? ? ?Nested nested;
? ? ?Nested getNested() {
? ? ? ? ?return nested;
? ?  }
?}
?// 第二層對象
?class Nested {
? ? ?Inner inner;
? ? ?Inner getInner() {
? ? ? ? ?return inner;
? ?  }
?}
?// 最底層對象
?class Inner {
? ? ?String foo;
? ? ?String getFoo() {
? ? ? ? ?return foo;
? ?  }
?}

業(yè)務(wù)中,假設(shè)我們需要獲取 Outer 對象對底層的 Inner 中的 foo 屬性,我們必須寫一堆的非空校驗,來防止發(fā)生 NullPointerException

?// 繁瑣的代碼
?Outer outer = new Outer();
?if (outer != null && outer.nested != null && outer.nested.inner != null) {
? ? ?System.out.println(outer.nested.inner.foo);
?}

通過 Optional

在 Java8 中,我們有更優(yōu)雅的解決方式,那就是使用 Optional 是說,我們可以在一行代碼中,進行流水式的 map 操作。而 map 方法內(nèi)部會自動進行空校驗

?Optional.of(new Outer())
? ?  .map(Outer::getNested)
? ?  .map(Nested::getInner)
? ?  .map(Inner::getFoo
? ?  .ifPresent(System.out::println); // 如果不為空,最終輸出 foo 的值

通過 suppiler 函數(shù)自定義增強 API

上面這種方式個人感覺還是有點啰嗦,我們可以利用 suppiler 函數(shù)來出一個終極解決方案:

?public static <T> Optional<T> resolve(Supplier<T> resolver) {
? ? ?try {
? ? ? ? ?T result = resolver.get();
? ? ? ? ?return Optional.ofNullable(result);
? ?  }
? ? ?catch (NullPointerException e) {
? ? ? ? ?// 可能會拋出空指針異常,直接返回一個空的 Optional 對象
? ? ? ? ?return Optional.empty();
? ?  }
?}

利用上面的 resolve 方法來重構(gòu)上述的非空校驗代碼段:

?Outer obj = new Outer();
?// 直接調(diào)用 resolve 方法,內(nèi)部做空指針的處理
?resolve(() -> obj.getNested().getInner().getFoo());
? ?  .ifPresent(System.out::println); // 如果不為空,最終輸出 foo 的值

最后

你需要知道的是,上面這兩個解決方案并沒傳統(tǒng)的 null 檢查性能那么高效。但在絕大部分業(yè)務(wù)場景下,舍棄那么一丟丟的性能來方便編碼,是完全可取, 除非是那種對性能有嚴格要求的場景,我們才不建議使用。

到此這篇關(guān)于詳解Java8新特性如何防止空指針異常的文章就介紹到這了,更多相關(guān)Java8空指針異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用Curator進行ZooKeeper操作的詳細教程

    Java使用Curator進行ZooKeeper操作的詳細教程

    Apache Curator 是一個基于 ZooKeeper 的 Java 客戶端庫,它極大地簡化了使用 ZooKeeper 的開發(fā)工作,在分布式系統(tǒng)中,ZooKeeper 通常被用來作為協(xié)調(diào)服務(wù),而 Curator 則為我們提供了更簡潔易用的接口,本文將介紹 Curator 的核心功能及實踐樣例,需要的朋友可以參考下
    2025-04-04
  • fastjson 使用方法詳細介紹

    fastjson 使用方法詳細介紹

    Fastjson是一個Java語言編寫的JSON處理器,由阿里巴巴公司開發(fā)。接下來通過本文給大家分享fastjson 使用方法詳細介紹,感興趣的朋友一起看看吧
    2017-11-11
  • 淺談Java多線程的優(yōu)點及代碼示例

    淺談Java多線程的優(yōu)點及代碼示例

    這篇文章主要介紹了淺談Java多線程的優(yōu)點及代碼示例,還是比較不錯的,這里分享給大家,需要的朋友可以參考。
    2017-11-11
  • SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫的配置方法

    SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫的配置方法

    這篇文章主要介紹了SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫的配置方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-03-03
  • java常用工具類 IP、File文件工具類

    java常用工具類 IP、File文件工具類

    這篇文章主要為大家詳細介紹了java常用工具類,包括IP、File文件工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • springboot整合jcasbin權(quán)限管理

    springboot整合jcasbin權(quán)限管理

    jcasbin的權(quán)限控制非常簡單,本文就來介紹一下springboot整合jcasbin權(quán)限管理,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • java實現(xiàn)斐波那契數(shù)列的3種方法

    java實現(xiàn)斐波那契數(shù)列的3種方法

    這篇文章主要介紹了java實現(xiàn)斐波那契數(shù)列的3種方法,有需要的朋友可以參考一下
    2014-01-01
  • Springboot實現(xiàn)MQTT通信的示例代碼

    Springboot實現(xiàn)MQTT通信的示例代碼

    本文主要介紹了Springboot實現(xiàn)MQTT通信的示例代碼,包含了MQTT協(xié)議的特點和工作原理等,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • Windows下使用IDEA搭建Hadoop開發(fā)環(huán)境的詳細方法

    Windows下使用IDEA搭建Hadoop開發(fā)環(huán)境的詳細方法

    這篇文章主要介紹了Windows下使用IDEA搭建Hadoop開發(fā)環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java中的自定義異常實現(xiàn)方式

    Java中的自定義異常實現(xiàn)方式

    這篇文章主要介紹了Java中的自定義異常實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04

最新評論