色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

善用Optional,告別NPE

京東云 ? 來源:京東物流 王亞寧 ? 作者:京東物流 王亞寧 ? 2024-12-18 09:46 ? 次閱讀

作者:京東物流 王亞寧

1、NPE是什么?

NPE:NullPointerException(空指針異常)??梢哉f自Null的誕生以來它就讓無數的程序員為之哀嚎,也是無數系統Bug的來源。托尼·霍爾(Tony Hoare),Null的發明者也表示過這是他十億美元的錯誤。當程序試圖在空引用(null)上調用方法或訪問屬性時,JVM會拋出NPE。例如:

String str = null;
int length = str.length(); // 這里會拋出NPE

1.1、NPE的常見原因

未初始化的對象:變量聲明后未賦值,即默認為null。

方法返回null:方法可能返回一個對象或null,但調用者未進行null檢查。

集合中的null元素:集合操作中插入了null,后續操作未處理。

多線程環境中的競態條件:一個線程修改對象狀態為null,另一個線程未及時檢查。

1.2、NPE的影響

程序崩潰:未處理的NPE會導致程序終止,影響用戶體驗。

調試困難:NPE的堆棧信息可能不直觀,定位問題源頭耗時。

代碼質量下降:頻繁的NPE表明代碼缺乏健壯的null處理機制。

2、Optional庫介紹

為了應對NPE問題,Java 8引入了Optional類,它是一個容器對象,可以包含或不包含非null的值。通過Optional,開發者可以顯式地表示一個值是可選的,從而強制進行null檢查,減少NPE的發生。

2.1、Optional的基本用法

創建Optional對象
Optional optional = Optional.of("Hello"); // 創建包含值的Optional
Optional emptyOptional = Optional.empty(); // 創建空的Optional
Optional nullableOptional = Optional.ofNullable(null); // 可以接受null
獲取值
// 使用get()獲取值,如果為空則拋出NoSuchElementException
optional.get();

// 使用orElse()提供默認值
String value = optional.orElse("Default");

// 使用orElseGet()提供默認值的Supplier
String value = optional.orElseGet(() -> "Default");

// 使用orElseThrow()在值為空時拋出異常
String value = optional.orElseThrow(() -> new IllegalArgumentException("Value is null"));
處理值
// 使用ifPresent()在值存在時執行操作
optional.ifPresent(val -> System.out.println(val));

// 使用map()轉換值
Optional lengthOptional = optional.map(String::length);

// 使用flatMap()處理嵌套的Optional
Optional> nestedOptional = Optional.of(Optional.of("Nested"));
Optional flatOptional = nestedOptional.flatMap(opt -> opt);

2.2、Optional的優勢

明確的意圖:方法返回Optional表明返回值可能為空,增強代碼的可讀性。

強制null檢查:通過Optional的方法鏈,開發者必須處理可能的空值,減少遺漏。

函數式編程支持:與Lambda表達式和Stream API無縫結合,簡化代碼邏輯。

3、最佳實例示例

示例背景

假設有一個用戶類User,包含一個地址類Address,而地址類中又包含城市信息City。在獲取用戶的城市名稱時,存在多級空指針的風險。

public class User {
    private Address address;

    public Address getAddress() {
        return address;
    }
}

public class Address {
    private City city;

    public City getCity() {
        return city;
    }
}

public class City {
    private String name;

    public String getName() {
        return name;
    }
}

使用傳統方式處理NPE

在沒有使用Optional的情況下,獲取城市名稱可能需要多級null檢查:

public String getUserCityName(User user) {
    if (user != null) {
        Address address = user.getAddress();
        if (address != null) {
            City city = address.getCity();
            if (city != null) {
                return city.getName();
            }
        }
    }
    return "Unknown";
}

上述代碼層層嵌套,邏輯復雜,且易于遺漏某一級的null檢查。并且代碼也不容易閱讀

使用Optional簡化代碼

利用Optional,可以將多級null檢查轉化為鏈式調用,代碼更加簡潔明了:

public String getUserCityName(Optional userOptional) {
    return userOptional
            .map(User::getAddress)
            .map(Address::getCity)
            .map(City::getName)
            .orElse("Unknown");
}

另一個實例:處理方法返回值

假設有一個方法findUserById,可能返回一個User對象或null。使用Optional可以優雅地處理返回值。

public Optional findUserById(String userId) {
    User user = userRepository.findById(userId); // 可能返回null
    return Optional.ofNullable(user);
}

調用方可以這樣使用:

findUserById("12345")
    .map(User::getAddress)
    .map(Address::getCity)
    .map(City::getName)
    .ifPresent(cityName -> System.out.println("User city: " + cityName));

如果User不存在或其地址、城市信息為null,上述代碼不會執行ifPresent中的打印操作,避免了NPE的風險。

總結

通過合理使用Java 8的Optional類,我們開發者可以有效減少NullPointerException的發生,提高代碼的健壯性和可維護性。然而,Optional并非萬能,需結合具體場景合理使用。掌握Optional的使用技巧和最佳實踐,將有助于編寫更安全、優雅的Java代碼,真正做到“善用Optional,告別NPE”。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2969

    瀏覽量

    104779
  • null
    +關注

    關注

    0

    文章

    19

    瀏覽量

    3974
收藏 人收藏

    評論

    相關推薦

    JDK8新增的Optional類的常用方法

    一、摘要 NullPointerException,中文名: 空指針異常 ,也簡稱 NPE,是軟件系統中最常見的錯誤異常之一。 很久以前 Google Guava 項目引入了 Optional 作為
    的頭像 發表于 09-30 15:13 ?576次閱讀

    善用戶資料任務是不是有BUG?

    新人完善用戶資料任務獲取積分,現在發現不管你怎樣完善都完成不了任務,是不是系統出現BUG了?
    發表于 10-06 09:11

    安裝使用Qualcomm Snapdragon神經處理引擎(NPE) SDK

    本文介紹了如何開始使用Qualcomm?Snapdragon?神經處理引擎(NPE)SDK。 從干凈的Ubuntu安裝開始,本教程旨在為您提供安裝依賴性的步驟,設置SDK工具,下載并準備一些示例
    發表于 09-25 16:48

    Snapdragon NPE SDK的環境配置

    上一篇博客簡單描述了一下對Snapdragon NPE(Neural Processing Engine) SDK的初步了解,現在來看看配置環境,用Snapdragon NPE SDK進行
    發表于 09-27 16:50

    Snapdragon NPE SDK配置模型文件的轉換和apk用例

    在上一篇博客中已經介紹了環境配置等,接下來接著看一下模型文件的轉換和apk用例 首先是模型文件的創建,Snapdragon NPE SDK沒有公共可用的模型文件,但是包含了一些腳本,這些腳本
    發表于 09-28 11:49

    【看動畫,學知識】告別山寨機!手機音質測定,快,穩,準!

    告別山寨機!手機音質測定,快,穩,準!
    發表于 06-20 10:39

    2009美國國際塑料展/美國塑料展/NPE-----金彼岸

    2009國際塑料展覽會(NPE2009)      
    發表于 05-05 12:05 ?677次閱讀

    利用Ajax與ExtJS 改善用戶體驗

    本內容詳細介紹了利用Ajax與ExtJS 改善用戶體驗
    發表于 05-24 15:21 ?24次下載
    利用Ajax與ExtJS 改<b class='flag-5'>善用</b>戶體驗

    JDK8 Optional類新特性

    Optional不是對null關鍵字的一種替代,而是對于null判定提供了一種更加優雅的實現。 NullPointException可以說是所有java程序員都遇到過的一個異常,雖然java從
    發表于 11-28 14:33 ?1776次閱讀

    Facebook和Qualcomm合作優化Caffe2和Snapdragon NPE

    在正在進行的Facebook F8開發者大會上,Facebook和Qualcomm宣布攜手合作,優化Caffe2和Snapdragon 神經處理引擎(NPE)軟件框架。 Caffe是由伯克利
    發表于 09-18 19:16 ?169次閱讀

    高通推出神經處理引擎(NPE)SDK,打造AI應用新優勢

    我們最近推出的驍龍?神經處理引擎(NPE)SDK,強調了在設備端對時間要求較高的AI應用處理的重要性。例如,自動駕駛汽車可以即時作出決定——在檢測到障礙物的同時加以識別和避免,而不是通過網絡發送到云端服務器。
    發表于 03-17 09:22 ?1472次閱讀

    JAVA8提供了Optional類來優化這種寫法

    這種寫法是比較丑陋的,為了避免上述丑陋的寫法,讓丑陋的設計變得優雅。JAVA8提供了Optional類來優化這種寫法,接下來的正文部分進行詳細說明
    的頭像 發表于 04-24 15:18 ?1088次閱讀

    認識Optional并使用

    的問題之一,那么我們今天就要盡可能的利用Java8的新特性 Optional來盡量簡化代碼同時高效處理NPE(Null Pointer Exception 空指針異常)。
    的頭像 發表于 09-05 14:18 ?759次閱讀

    是時候告別汽車照明離散解決方案了!

    是時候告別汽車照明離散解決方案了!
    發表于 11-01 08:26 ?0次下載
    是時候<b class='flag-5'>告別</b>汽車照明離散解決方案了!

    善用可靠且性價比高的隔離技術來應對高電壓設計挑戰

    電子發燒友網站提供《善用可靠且性價比高的隔離技術來應對高電壓設計挑戰》資料免費下載
    發表于 11-22 09:38 ?0次下載
    <b class='flag-5'>善用</b>可靠且性價比高的隔離技術來應對高電壓設計挑戰
    主站蜘蛛池模板: 攻把受做得合不拢腿play| 中国午夜伦理片| 真实国产精品视频国产网| 吃奶摸下的激烈免费视频| 内地同志男16china16| 在线观看日本污污ww网站| 又黄又爽又无遮挡在线观看免费| 免费韩国伦理2017最新| 黄色大片久久| 国产交换丝雨巅峰| NANANA在线观看高清影院| 孕妇bbwbbwbbwbbw超清| 午夜伦伦电影理论片大片| 人善交XUANWEN200喷水| 美女被抽插到哭内射视频免费| 国产人妻精品久久久久久很牛| 大桥未久在线看| AV国产乱码一区二区三视频| 在线视频 日韩视频二区| 亚洲国产成人精品不卡青青草原 | 羞羞影院午夜男女爽爽影院网站| 国产精品爽黄69天堂A片| 亚洲国产综合久久精品| 九九国产精品成人AV麻豆| 亚洲一区在线观看无码欧美| 久久精品国产亚洲精品2020| 91黄色大片| 日韩精品在线看| 国产精品无码视频一区二区| 亚洲精品国产自在现线最新 | 国产精品久久久久久久人热 | 国产精品路线1路线2路线| 亚洲国产欧美日韩在线一区| 久久se精品一区二区国产| 一久久| 乱精品一区字幕二区| a视频在线观看免费| 午夜免费小视频| 美女被打开了屁股进去的视频| 成年人视频在线免费| 亚洲精品国产在线网站|