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

Java空指針異常處理之判空、Optional與Assert解析

 更新時(shí)間:2025年01月24日 09:58:41   作者:Yeats_Liao  
本文將深入探討三種處理空指針異常的方法:傳統(tǒng)的判空檢查、Java 8引入的Optional類以及使用斷言(Assert),通過代碼示例和應(yīng)用場景分析,幫助開發(fā)者理解并選擇最適合的方案以提升程序健壯性,感興趣的朋友一起看看吧

在Java編程中,空指針異常(NullPointerException)是最常見的運(yùn)行時(shí)錯(cuò)誤之一。本文將深入探討三種處理空指針異常的方法:傳統(tǒng)的判空檢查、Java 8引入的Optional類以及使用斷言(Assert)。通過代碼示例和應(yīng)用場景分析,幫助開發(fā)者理解并選擇最適合的方案以提升程序健壯性。

1. 傳統(tǒng)判空檢查

首先檢查person是否為null。只有當(dāng)它不為空時(shí),才會(huì)訪問其成員變量namejob。對于job,同樣進(jìn)行了判空處理。

public class TraditionalNullCheck {
    public void processPerson(Person person) {
        // 判空處理:如果person為null,則輸出提示信息并返回
        if (person != null) {
            System.out.println("Name: " + person.getName());
        } else {
            System.out.println("Error: Person is null");
            return;
        }
        // 對非空對象進(jìn)行后續(xù)操作
        String job = person.getJob();
        // 需要對job也進(jìn)行判空檢查,防止NPE
        if (job != null) {
            System.out.println("Job: " + job);
        } else {
            System.out.println("Warning: Job information not available for the person");
        }
    }
    static class Person {
        private String name;
        private String job;
        // 構(gòu)造函數(shù)、getters & setters 省略
    }
}

2. 使用Java 8 Optional類

Java 8 的 Optional 類用于更好處理可能為 null 的對象值。傳統(tǒng) Java 開發(fā)中,直接訪問可能為 null 的對象引用會(huì)導(dǎo)致 NullPointerException。開發(fā)者常手動(dòng)進(jìn)行 null 檢查。Optional 類提供更安全、清晰方式表示和操作可能缺失的對象,像個(gè)盒子,要么裝著對象,要么為空。

import java.util.Optional;
public class OptionalDemo {
    public void processPerson(Person person) {
        // 創(chuàng)建一個(gè)Optional實(shí)例,傳入可能為null的變量
        Optional<Person> optionalPerson = Optional.ofNullable(person);
        // 使用Optional提供的方法避免空指針異常
        optionalPerson.ifPresent(p -> System.out.println("Name: " + p.getName()));
        // 或者通過orElse()返回默認(rèn)值
        String name = optionalPerson.map(Person::getName).orElse("Unknown");
        System.out.println("Name (with default): " + name);
        // 如果希望在對象為空時(shí)拋出異常,可以使用orElseThrow()
        try {
            String job = optionalPerson.flatMap(Person::getJob)
                                      .orElseThrow(() -> new IllegalArgumentException("Person is null or has no job"));
            System.out.println("Job: " + job);
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
    static class Person {
        private String name;
        private Optional<String> job; // 這里也可以用Optional封裝job
        // 構(gòu)造函數(shù)、getters & setters 省略
    }
}
  • Optional.ofNullable():創(chuàng)建一個(gè)Optional對象,如果傳入的參數(shù)不為null,則包含該參數(shù);如果為null,則創(chuàng)建一個(gè)空的Optional。
  • ifPresent(Consumer):如果Optional中包含非null的值,則執(zhí)行傳入的Consumer接口中的方法。
  • map(Function):對Optional中包含的值應(yīng)用一個(gè)函數(shù),如果原值存在,則返回一個(gè)新的Optional,其中包含了轉(zhuǎn)換后的值;如果原值不存在,則返回一個(gè)空的Optional。
  • orElse(T):如果Optional中包含非null的值,則返回該值;否則返回給定的默認(rèn)值。
  • orElseThrow(Supplier):如果Optional中有值,則返回該值;若沒有值,則拋出自定義異常,這里的Supplier用于生成拋出的異常實(shí)例。

3. 使用斷言(Assert)

斷言主要用于開發(fā)調(diào)試和內(nèi)部錯(cuò)誤檢測,不推薦處理業(yè)務(wù)邏輯可預(yù)期錯(cuò)誤。可用assertNotNull()斷言方法保證傳入?yún)?shù)非空,開發(fā)階段或 JVM 啟用斷言時(shí)傳入 null 值會(huì)拋出AssertionError,助開發(fā)者盡早發(fā)現(xiàn)問題。但生產(chǎn)環(huán)境默認(rèn)關(guān)閉斷言,不能依賴此避免空指針異常。

import static org.junit.Assert.assertNotNull;
public class AssertExample {
    public void processPerson(Person person) {
        // 在開發(fā)階段確保參數(shù)非空,否則拋出AssertionError
        assertNotNull("Person should not be null", person);
        // 如果assertion未禁用,這段代碼將不會(huì)觸發(fā)NullPointerException
        System.out.println("Name: " + person.getName());
        System.out.println("Job: " + person.getJob());
    }
    public static void main(String[] args) {
        // 測試代碼
        Person validPerson = new Person("Alice", "Engineer");
        processPerson(validPerson);
        // 運(yùn)行時(shí)會(huì)拋出AssertionError
        processPerson(null);
    }
}
static class Person {
    private String name;
    private String job;
    // 構(gòu)造函數(shù)、getters & setters 省略
}

4. 區(qū)別總結(jié)

傳統(tǒng)判空檢查:適用于任何場景,但易致代碼冗余和忘檢致空指針,適用于性能敏感或 Optional 不適用的老項(xiàng)目,執(zhí)行重要操作前保證對象非空。
Optional 類:增強(qiáng)代碼可讀性和安全性,新開發(fā)項(xiàng)目中方法返回值可能為 null 時(shí)適用,可簡化空值檢查,但過度依賴會(huì)使代碼復(fù)雜,不適合所有場景尤其 API 設(shè)計(jì)。
斷言(Assert):主要用于單元測試和開發(fā)階段,驗(yàn)證不應(yīng)發(fā)生情況,生產(chǎn)環(huán)境默認(rèn)關(guān)閉,可在單元測試嚴(yán)格校驗(yàn)輸入條件及復(fù)雜調(diào)用鏈中防空指針異常,輔助發(fā)現(xiàn)生產(chǎn)環(huán)境早期設(shè)計(jì)和實(shí)現(xiàn)問題。

What is Java technology and why do I need it?
Java is a programming language and computing platform first released by Sun Microsystems in 1995. It has evolved from humble beginnings to power a large share of today’s digital world, by providing the reliable platform upon which many services and applications are built. New, innovative products and digital services designed for the future continue to rely on Java, as well.

While most modern Java applications combine the Java runtime and application together, there are still many applications and even some websites that will not function unless you have a desktop Java installed. Java.com, this website, is intended for consumers who may still require Java for their desktop applications – specifically applications targeting Java 8. Developers as well as users that would like to learn Java programming should visit the dev.java website instead and business users should visit oracle.com/java for more information.

Is Java free to download?
Yes, Java is free to download for personal use.
Java is also free for development: developers can find all the development kits and other useful tools at https://www.oracle.com/javadownload/.

Why should I upgrade to the latest Java patch each quarter when prompted?
The latest Java patches contain important enhancements to improve performance, stability and security of the Java applications that run on your machine. Installing these updates will ensure that your Java applications continue to run with the most up-to-date version.

到此這篇關(guān)于Java空指針異常處理:判空、Optional與Assert解析的文章就介紹到這了,更多相關(guān)Java空指針異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中線程狀態(tài)+線程安全問題+synchronized的用法詳解

    Java中線程狀態(tài)+線程安全問題+synchronized的用法詳解

    這篇文章主要介紹了Java中線程狀態(tài)+線程安全問題+synchronized的用法詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • hystrix配置中Apollo與Archaius對比分析

    hystrix配置中Apollo與Archaius對比分析

    這篇文章主要為大家介紹了hystrix的配置中Apollo與Archaius對比分析,并為大家解答在hystrix的配置中有了Apollo是否還需要Archaius這一問題詳解
    2022-02-02
  • Java使用正則表達(dá)式進(jìn)行匹配且對匹配結(jié)果逐個(gè)替換

    Java使用正則表達(dá)式進(jìn)行匹配且對匹配結(jié)果逐個(gè)替換

    這篇文章主要介紹了Java使用正則表達(dá)式進(jìn)行匹配且對匹配結(jié)果逐個(gè)替換,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • springboot jackson自定義序列化和反序列化實(shí)例

    springboot jackson自定義序列化和反序列化實(shí)例

    這篇文章主要介紹了spring boot jackson自定義序列化和反序列化實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot集成Devtools實(shí)現(xiàn)熱更新

    SpringBoot集成Devtools實(shí)現(xiàn)熱更新

    DevTools是開發(fā)者工具集,主要用于簡化開發(fā)過程中的熱部署問題,熱部署是指在開發(fā)過程中,當(dāng)代碼發(fā)生變化時(shí),無需手動(dòng)重啟應(yīng)用,系統(tǒng)能夠自動(dòng)檢測并重新加載修改后的代碼,本文給大家介紹了SpringBoot集成Devtools實(shí)現(xiàn)熱更新,需要的朋友可以參考下
    2024-08-08
  • java9學(xué)習(xí)系列之在docker中如何運(yùn)行java9

    java9學(xué)習(xí)系列之在docker中如何運(yùn)行java9

    最近在學(xué)習(xí)java9,所以將學(xué)習(xí)中遇到的一些知識點(diǎn)分享給大家,下面這篇文章主要給大家介紹了java9學(xué)習(xí)系列之在docker中如何運(yùn)行java9的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • Java中線程上下文類加載器超詳細(xì)講解使用

    Java中線程上下文類加載器超詳細(xì)講解使用

    這篇文章主要介紹了Java中線程上下文類加載器,類加載器負(fù)責(zé)讀取Java字節(jié)代碼,并轉(zhuǎn)換成java.lang.Class類的一個(gè)實(shí)例的代碼模塊。本文主要和大家聊聊JVM類加載器ClassLoader的使用,需要的可以了解一下
    2022-12-12
  • 利用Java實(shí)現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片)的詳細(xì)代碼

    利用Java實(shí)現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片)的詳細(xì)代碼

    這篇文章主要為大家詳細(xì)介紹了利用Java實(shí)現(xiàn)word導(dǎo)入導(dǎo)出富文本(含圖片),文中的示例代碼講解詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下
    2024-02-02
  • idea使用easyCode生成代碼(根據(jù)mybatis-plus模板創(chuàng)建自己的模板)

    idea使用easyCode生成代碼(根據(jù)mybatis-plus模板創(chuàng)建自己的模板)

    本文主要介紹了idea使用easyCode生成代碼,easyCode代碼生成器可以減少低價(jià)值搬磚,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Java 開發(fā)環(huán)境配置步驟(介紹)

    Java 開發(fā)環(huán)境配置步驟(介紹)

    下面小編就為大家?guī)硪黄狫ava 開發(fā)環(huán)境配置步驟(介紹)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論

神农架林区| 黄浦区| 马边| 阿鲁科尔沁旗| 贵港市| 涡阳县| 慈溪市| 景泰县| 叶城县| 睢宁县| 五河县| 青海省| 沙洋县| 犍为县| 清原| 吉隆县| 连南| 泸州市| 龙州县| 孟连| 昆山市| 白山市| 沅江市| 金昌市| 时尚| 通海县| 阆中市| 新绛县| 乾安县| 衢州市| 砀山县| 疏附县| 宝山区| 扬州市| 南乐县| 泰顺县| 勐海县| 盐边县| 辽宁省| 饶河县| 武山县|