最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

下面是 Tony Hoare 的原話:

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

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

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

在 Groovy 或 Kotlin 這樣的語言中也被稱為 Elvis運(yùn)算符。

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

Java8 中如何加強(qiáng)對(duì) Null 對(duì)象的檢查?

接下來,我們細(xì)說一下如何通過 Optional 類來對(duì)對(duì)象做空校驗(yàn):

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

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

業(yè)務(wù)中,假設(shè)我們需要獲取 Outer 對(duì)象對(duì)底層的 Inner 中的 foo 屬性,我們必須寫一堆的非空校驗(yàn),來防止發(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 是說,我們可以在一行代碼中,進(jìn)行流水式的 map 操作。而 map 方法內(nèi)部會(huì)自動(dòng)進(jìn)行空校驗(yàn)

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

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

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

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

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

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

最后

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

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

相關(guān)文章

  • java查找圖中兩點(diǎn)之間所有路徑

    java查找圖中兩點(diǎn)之間所有路徑

    這篇文章主要為大家詳細(xì)介紹了java查找圖中兩點(diǎn)之間所有路徑,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java開發(fā)第一個(gè)RESTful接口完全攻略

    Java開發(fā)第一個(gè)RESTful接口完全攻略

    restful接口是一種基于http協(xié)議的網(wǎng)絡(luò)應(yīng)用程序接口設(shè)計(jì)風(fēng)格,它強(qiáng)調(diào)資源的表現(xiàn)形式和狀態(tài)轉(zhuǎn)移,下面這篇文章主要介紹了Java開發(fā)RESTful接口的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01
  • SpringBoot如何升級(jí)到3.0

    SpringBoot如何升級(jí)到3.0

    這篇文章主要介紹了SpringBoot如何升級(jí)到3.0問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java解析zip文件,并識(shí)別壓縮包里面的文件轉(zhuǎn)換成可操作的IO流方式

    Java解析zip文件,并識(shí)別壓縮包里面的文件轉(zhuǎn)換成可操作的IO流方式

    這篇文章主要介紹了Java解析zip文件,并識(shí)別壓縮包里面的文件轉(zhuǎn)換成可操作的IO流方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 基于HTML5+js+Java實(shí)現(xiàn)單文件文件上傳到服務(wù)器功能

    基于HTML5+js+Java實(shí)現(xiàn)單文件文件上傳到服務(wù)器功能

    應(yīng)公司要求,在HTML5頁面上實(shí)現(xiàn)上傳文件到服務(wù)器功能,對(duì)于我這樣的菜鳥,真是把我難住了,最后還是請(qǐng)教大神搞定的,下面小編把例子分享到腳本之家平臺(tái),供大家參考
    2017-08-08
  • Spring中的@PostConstruct注解使用方法解析

    Spring中的@PostConstruct注解使用方法解析

    這篇文章主要介紹了Spring中的@PostConstruct注解使用方法解析,@PostConstruct注解是用來處理在@Autowired注入屬性后init()方法之前,對(duì)一些零散的屬性進(jìn)行賦值的注解,需要的朋友可以參考下
    2023-11-11
  • Java lock同步鎖使用實(shí)例解析

    Java lock同步鎖使用實(shí)例解析

    這篇文章主要介紹了Java lock同步鎖使用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringMVC配置與使用詳細(xì)介紹

    SpringMVC配置與使用詳細(xì)介紹

    Spring MVC是一個(gè)基于Java的實(shí)現(xiàn)了MVC設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,通過把Model,View,Controller分離,將web層進(jìn)行職責(zé)解耦,把復(fù)雜的web應(yīng)用分成邏輯清晰的幾部分,簡(jiǎn)化開發(fā),減少出錯(cuò),方便組內(nèi)配合
    2022-07-07
  • resty mail的簡(jiǎn)單發(fā)送郵件方法

    resty mail的簡(jiǎn)單發(fā)送郵件方法

    這篇文章主要為大家介紹了簡(jiǎn)單的resty mail發(fā)送郵件方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-03-03
  • MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例

    MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例

    在MyBatis-Plus中,可以通過自定義攔截器來實(shí)現(xiàn)對(duì)SQL語句的攔截和修改,本文就來介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10

最新評(píng)論

丽江市| 隆尧县| 霍山县| 上思县| 桃园市| 尼勒克县| 东乡族自治县| 鸡西市| 禄丰县| 赣州市| 郑州市| 蒲城县| 平遥县| 东乌| 读书| 且末县| 神木县| 舒兰市| 博湖县| 平武县| 包头市| 盐津县| 苏尼特左旗| 稻城县| 德庆县| 湘潭县| 莎车县| 双牌县| 太湖县| 清苑县| 乳源| 安乡县| 宜兰市| 惠水县| 大英县| 滨海县| 漳浦县| 灌南县| 新竹市| 漳浦县| 斗六市|