精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網(wǎng)站建設(shè)資訊

NEWS

網(wǎng)站建設(shè)資訊

在Java8中如何風(fēng)騷走位的避開空指針異常

前言

創(chuàng)新互聯(lián)主要從事網(wǎng)站制作、做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)香河,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

要說 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ì)象的檢查?

在上篇文章 Java8 新特性指導(dǎo)手冊(cè) 中簡(jiǎn)單的提了一下如何通過 Optional 類來對(duì)對(duì)象做空校驗(yàn)。接下來,我們?cè)偌?xì)說一下:

在業(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  Optional resolve(Supplier 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)格要求的,我們才不建議使用。

個(gè)人覺得,真要拿這點(diǎn)性能說事,還不如去優(yōu)化優(yōu)化 sql 語句,業(yè)務(wù)邏輯等。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。


名稱欄目:在Java8中如何風(fēng)騷走位的避開空指針異常
本文地址:http://m.jcarcd.cn/article/pijsid.html
主站蜘蛛池模板: 乱伦自拍影视三级 | 国产免费高清 | 午夜免费时刻 | 无码av免费一区二区三区 | 成人午夜视频精品一 | 国产系列 | 精品日韩欧美在线 | 韩国三级网 | 国内精品小视频在线 | 无码精品国产第一区二区 | 国产91免费不 | 中文字幕日本不卡 | 青青视屏 | 国产美女一级 | 午夜日韩视频 | 日韩亚色五月 | 国产在线乱子伦一区 | 日本一本a高清免费 | 国产高清精品一区 | 国产精品玖玖 | 三级a三级三级 | 日韩欧美第一区 | 99re在线| 精品午夜国 | 国产成熟 | 国产日韩激情 | 精品欧美一区二区视 | 国产亚洲自拍一区 | 日本一级电影网站 | 另类激情文学一 | 国产日韩欧美一 | www.黄动| 精品在线观看一区 | 日本男女性生活视频 | 伦理片免费观在线看 | 国产91免费视频 | 成人区一区 | 精品国产91在店 | 区二区三区中文 | 欧美午夜高清在线 | 成人极品影院 |