一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

善用Optional,告別NPE

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

作者:京東物流 王亞寧

1、NPE是什么?

NPE:NullPointerException(空指針異常)。可以說(shuō)自Null的誕生以來(lái)它就讓無(wú)數(shù)的程序員為之哀嚎,也是無(wú)數(shù)系統(tǒng)Bug的來(lái)源。托尼·霍爾(Tony Hoare),Null的發(fā)明者也表示過(guò)這是他十億美元的錯(cuò)誤。當(dāng)程序試圖在空引用(null)上調(diào)用方法或訪(fǎng)問(wèn)屬性時(shí),JVM會(huì)拋出NPE。例如:

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

1.1、NPE的常見(jiàn)原因

未初始化的對(duì)象:變量聲明后未賦值,即默認(rèn)為null。

方法返回null:方法可能返回一個(gè)對(duì)象或null,但調(diào)用者未進(jìn)行null檢查。

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

多線(xiàn)程環(huán)境中的競(jìng)態(tài)條件:一個(gè)線(xiàn)程修改對(duì)象狀態(tài)為null,另一個(gè)線(xiàn)程未及時(shí)檢查。

1.2、NPE的影響

程序崩潰:未處理的NPE會(huì)導(dǎo)致程序終止,影響用戶(hù)體驗(yàn)。

調(diào)試?yán)щy:NPE的堆棧信息可能不直觀(guān),定位問(wèn)題源頭耗時(shí)。

代碼質(zhì)量下降:頻繁的NPE表明代碼缺乏健壯的null處理機(jī)制。

2、Optional庫(kù)介紹

為了應(yīng)對(duì)NPE問(wèn)題,Java 8引入了Optional類(lèi),它是一個(gè)容器對(duì)象,可以包含或不包含非null的值。通過(guò)Optional,開(kāi)發(fā)者可以顯式地表示一個(gè)值是可選的,從而強(qiáng)制進(jìn)行null檢查,減少NPE的發(fā)生。

2.1、Optional的基本用法

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

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

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

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

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

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

2.2、Optional的優(yōu)勢(shì)

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

強(qiáng)制null檢查:通過(guò)Optional的方法鏈,開(kāi)發(fā)者必須處理可能的空值,減少遺漏。

函數(shù)式編程支持:與Lambda表達(dá)式和Stream API無(wú)縫結(jié)合,簡(jiǎn)化代碼邏輯。

3、最佳實(shí)例示例

示例背景

假設(shè)有一個(gè)用戶(hù)類(lèi)User,包含一個(gè)地址類(lèi)Address,而地址類(lèi)中又包含城市信息City。在獲取用戶(hù)的城市名稱(chēng)時(shí),存在多級(jí)空指針的風(fēng)險(xiǎn)。

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;
    }
}

使用傳統(tǒng)方式處理NPE

在沒(méi)有使用Optional的情況下,獲取城市名稱(chēng)可能需要多級(jí)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";
}

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

使用Optional簡(jiǎn)化代碼

利用Optional,可以將多級(jí)null檢查轉(zhuǎn)化為鏈?zhǔn)秸{(diào)用,代碼更加簡(jiǎn)潔明了:

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

另一個(gè)實(shí)例:處理方法返回值

假設(shè)有一個(gè)方法findUserById,可能返回一個(gè)User對(duì)象或null。使用Optional可以?xún)?yōu)雅地處理返回值。

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

調(diào)用方可以這樣使用:

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

如果User不存在或其地址、城市信息為null,上述代碼不會(huì)執(zhí)行ifPresent中的打印操作,避免了NPE的風(fēng)險(xiǎn)。

總結(jié)

通過(guò)合理使用Java 8的Optional類(lèi),我們開(kāi)發(fā)者可以有效減少NullPointerException的發(fā)生,提高代碼的健壯性和可維護(hù)性。然而,Optional并非萬(wàn)能,需結(jié)合具體場(chǎng)景合理使用。掌握Optional的使用技巧和最佳實(shí)踐,將有助于編寫(xiě)更安全、優(yōu)雅的Java代碼,真正做到“善用Optional,告別NPE”。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2983

    瀏覽量

    106496
  • null
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    4068
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    JDK8新增的Optional類(lèi)的常用方法

    一、摘要 NullPointerException,中文名: 空指針異常 ,也簡(jiǎn)稱(chēng) NPE,是軟件系統(tǒng)中最常見(jiàn)的錯(cuò)誤異常之一。 很久以前 Google Guava 項(xiàng)目引入了 Optional 作為
    的頭像 發(fā)表于 09-30 15:13 ?753次閱讀

    善用戶(hù)資料任務(wù)是不是有BUG?

    新人完善用戶(hù)資料任務(wù)獲取積分,現(xiàn)在發(fā)現(xiàn)不管你怎樣完善都完成不了任務(wù),是不是系統(tǒng)出現(xiàn)BUG了?
    發(fā)表于 10-06 09:11

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

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

    Snapdragon NPE SDK的環(huán)境配置

    上一篇博客簡(jiǎn)單描述了一下對(duì)Snapdragon NPE(Neural Processing Engine) SDK的初步了解,現(xiàn)在來(lái)看看配置環(huán)境,用Snapdragon NPE SDK進(jìn)行
    發(fā)表于 09-27 16:50

    Snapdragon NPE SDK配置模型文件的轉(zhuǎn)換和apk用例

    在上一篇博客中已經(jīng)介紹了環(huán)境配置等,接下來(lái)接著看一下模型文件的轉(zhuǎn)換和apk用例 首先是模型文件的創(chuàng)建,Snapdragon NPE SDK沒(méi)有公共可用的模型文件,但是包含了一些腳本,這些腳本
    發(fā)表于 09-28 11:49

    【看動(dòng)畫(huà),學(xué)知識(shí)】告別山寨機(jī)!手機(jī)音質(zhì)測(cè)定,快,穩(wěn),準(zhǔn)!

    告別山寨機(jī)!手機(jī)音質(zhì)測(cè)定,快,穩(wěn),準(zhǔn)!
    發(fā)表于 06-20 10:39

    2009美國(guó)國(guó)際塑料展/美國(guó)塑料展/NPE-----金彼岸

    2009國(guó)際塑料展覽會(huì)(NPE2009)      
    發(fā)表于 05-05 12:05 ?708次閱讀

    利用Ajax與ExtJS 改善用戶(hù)體驗(yàn)

    本內(nèi)容詳細(xì)介紹了利用Ajax與ExtJS 改善用戶(hù)體驗(yàn)
    發(fā)表于 05-24 15:21 ?24次下載
    利用Ajax與ExtJS 改<b class='flag-5'>善用</b>戶(hù)體驗(yàn)

    JDK8 Optional類(lèi)新特性

    Optional不是對(duì)null關(guān)鍵字的一種替代,而是對(duì)于null判定提供了一種更加優(yōu)雅的實(shí)現(xiàn)。 NullPointException可以說(shuō)是所有java程序員都遇到過(guò)的一個(gè)異常,雖然java從
    發(fā)表于 11-28 14:33 ?1883次閱讀

    Facebook和Qualcomm合作優(yōu)化Caffe2和Snapdragon NPE

    在正在進(jìn)行的Facebook F8開(kāi)發(fā)者大會(huì)上,F(xiàn)acebook和Qualcomm宣布攜手合作,優(yōu)化Caffe2和Snapdragon 神經(jīng)處理引擎(NPE)軟件框架。 Caffe是由伯克利
    發(fā)表于 09-18 19:16 ?204次閱讀

    高通推出神經(jīng)處理引擎(NPE)SDK,打造AI應(yīng)用新優(yōu)勢(shì)

    我們最近推出的驍龍?神經(jīng)處理引擎(NPE)SDK,強(qiáng)調(diào)了在設(shè)備端對(duì)時(shí)間要求較高的AI應(yīng)用處理的重要性。例如,自動(dòng)駕駛汽車(chē)可以即時(shí)作出決定——在檢測(cè)到障礙物的同時(shí)加以識(shí)別和避免,而不是通過(guò)網(wǎng)絡(luò)發(fā)送到云端服務(wù)器。
    發(fā)表于 03-17 09:22 ?1581次閱讀

    JAVA8提供了Optional類(lèi)來(lái)優(yōu)化這種寫(xiě)法

    這種寫(xiě)法是比較丑陋的,為了避免上述丑陋的寫(xiě)法,讓丑陋的設(shè)計(jì)變得優(yōu)雅。JAVA8提供了Optional類(lèi)來(lái)優(yōu)化這種寫(xiě)法,接下來(lái)的正文部分進(jìn)行詳細(xì)說(shuō)明
    的頭像 發(fā)表于 04-24 15:18 ?1246次閱讀

    認(rèn)識(shí)Optional并使用

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

    E10A-USB Optional 38-Pin User System Interface Cable HS0005ECK01H 用戶(hù)手冊(cè)

    E10A-USB Optional 38-Pin User System Interface Cable HS0005ECK01H 用戶(hù)手冊(cè)
    發(fā)表于 05-06 18:58 ?0次下載
    E10A-USB <b class='flag-5'>Optional</b> 38-Pin User System Interface Cable HS0005ECK01H 用戶(hù)手冊(cè)

    善用可靠且性?xún)r(jià)比高的隔離技術(shù)來(lái)應(yīng)對(duì)高電壓設(shè)計(jì)挑戰(zhàn)

    電子發(fā)燒友網(wǎng)站提供《善用可靠且性?xún)r(jià)比高的隔離技術(shù)來(lái)應(yīng)對(duì)高電壓設(shè)計(jì)挑戰(zhàn)》資料免費(fèi)下載
    發(fā)表于 11-22 09:38 ?0次下載
    <b class='flag-5'>善用</b>可靠且性?xún)r(jià)比高的隔離技術(shù)來(lái)應(yīng)對(duì)高電壓設(shè)計(jì)挑戰(zhàn)