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

在Java8中如何避開空指針異常

 更新時間:2019年06月03日 10:40:11   作者:犬小哈  
這篇文章主要給大家介紹了關于在Java8中如何風騷走位的避開空指針異常的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

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

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

下面是 Tony Hoare 的原話:

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

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

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

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

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

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

在上篇文章 Java8 新特性指導手冊 中簡單的提了一下如何通過 Optional 類來對對象做空校驗。接下來,我們再細說一下:

在業(yè)務系統(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è)務中,假設我們需要獲取 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 方法內部會自動進行空校驗 :

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 方法來重構上述的非空校驗代碼段:

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

最后

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

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

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • java程序員必須知道的4個書寫代碼技巧

    java程序員必須知道的4個書寫代碼技巧

    本篇文章主要給大家講述了作為JAVA程序員如何能寫出高效的代碼以及運行效率更高的代碼,一起學習分享下吧。
    2017-12-12
  • java異步上傳圖片示例

    java異步上傳圖片示例

    這篇文章主要介紹了java異步上傳圖片示例,需要的朋友可以參考下
    2014-02-02
  • Java?中?hashCode()?與?equals()?的關系(面試)

    Java?中?hashCode()?與?equals()?的關系(面試)

    這篇文章主要介紹了Java中hashCode()與equals()的關系,ava中hashCode()和equals()的關系是面試中的常考點,文章對hashCode與equals的關系做出詳解,需要的小伙伴可以參考一下
    2022-09-09
  • Java編程Webservice指定超時時間代碼詳解

    Java編程Webservice指定超時時間代碼詳解

    這篇文章主要介紹了Java編程Webservice指定超時時間代碼詳解,簡單介紹了webservice,然后分享了通過使用JDK對Webservice的支持進行Webservice調用實現(xiàn)指定超時時間完整示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • java 中 zookeeper簡單使用

    java 中 zookeeper簡單使用

    ZooKeeper是一個分布式的,開放源碼的分布式應用程序協(xié)調服務,是Google的Chubby一個開源的實現(xiàn),是Hadoop和Hbase的重要組件。下面通過本文給大家分享java 中 zookeeper簡單使用,需要的朋友參考下吧
    2017-09-09
  • java  List循環(huán)與Map循環(huán)的總結

    java List循環(huán)與Map循環(huán)的總結

    這篇文章主要介紹了java List循環(huán)與Map循環(huán)的總結的相關資料,并附代碼實例,幫助大家學習理解,需要的朋友可以參考下
    2016-11-11
  • 利用Java提取PDF表格到文本、CSV及excel工作表

    利用Java提取PDF表格到文本、CSV及excel工作表

    如何精準地提取PDF格式中嵌入的表格數(shù)據(jù),并將其無縫轉換為更加易于分析和操作的形式,是一項重要的文檔處理技巧,本文將介紹如何利用Java從PDF文檔提取表格數(shù)據(jù),并寫入文本文件、CSV文件以及Excel工作表,需要的朋友可以參考下
    2024-09-09
  • Java為什么占用四個字節(jié)你知道嗎

    Java為什么占用四個字節(jié)你知道嗎

    這篇文章主要介紹了Java為什么占四個字節(jié),文中介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • Java使用BigDecimal公式精確計算及精度丟失問題

    Java使用BigDecimal公式精確計算及精度丟失問題

    在工作中經(jīng)常會遇到數(shù)值精度問題,比如說使用float或者double的時候,可能會有精度丟失問題,下面這篇文章主要給大家介紹了關于Java使用BigDecimal公式精確計算及精度丟失問題的相關資料,需要的朋友可以參考下
    2023-01-01
  • SpringBoot接口調用之后報404問題的解決方案

    SpringBoot接口調用之后報404問題的解決方案

    這篇文章主要介紹了SpringBoot接口調用之后報404問題的解決方案,具有很好的參考價值,希望對大家有所幫助。
    2021-06-06

最新評論

德江县| 郧西县| 诏安县| 南召县| 德阳市| 邮箱| 海安县| 刚察县| 方正县| 仙游县| 施甸县| 裕民县| 延寿县| 家居| 邯郸市| 卢龙县| 县级市| 盐源县| 邵阳县| 富锦市| 如东县| 凤翔县| 阳谷县| 扬州市| 鞍山市| 怀柔区| 个旧市| 望城县| 宜阳县| 石景山区| 东丰县| 治多县| 洛浦县| 宿松县| 灯塔市| 永兴县| 阿鲁科尔沁旗| 夹江县| 桃园县| 嘉黎县| 连云港市|