欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

首先檢查person是否為null。只有當它不為空時,才會訪問其成員變量namejob。對于job,同樣進行了判空處理。

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;
        }
        // 對非空對象進行后續(xù)操作
        String job = person.getJob();
        // 需要對job也進行判空檢查,防止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 的對象引用會導(dǎo)致 NullPointerException。開發(fā)者常手動進行 null 檢查。Optional 類提供更安全、清晰方式表示和操作可能缺失的對象,像個盒子,要么裝著對象,要么為空。

import java.util.Optional;
public class OptionalDemo {
    public void processPerson(Person person) {
        // 創(chuàng)建一個Optional實例,傳入可能為null的變量
        Optional<Person> optionalPerson = Optional.ofNullable(person);
        // 使用Optional提供的方法避免空指針異常
        optionalPerson.ifPresent(p -> System.out.println("Name: " + p.getName()));
        // 或者通過orElse()返回默認值
        String name = optionalPerson.map(Person::getName).orElse("Unknown");
        System.out.println("Name (with default): " + name);
        // 如果希望在對象為空時拋出異常,可以使用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)建一個Optional對象,如果傳入的參數(shù)不為null,則包含該參數(shù);如果為null,則創(chuàng)建一個空的Optional。
  • ifPresent(Consumer):如果Optional中包含非null的值,則執(zhí)行傳入的Consumer接口中的方法。
  • map(Function):對Optional中包含的值應(yīng)用一個函數(shù),如果原值存在,則返回一個新的Optional,其中包含了轉(zhuǎn)換后的值;如果原值不存在,則返回一個空的Optional。
  • orElse(T):如果Optional中包含非null的值,則返回該值;否則返回給定的默認值。
  • orElseThrow(Supplier):如果Optional中有值,則返回該值;若沒有值,則拋出自定義異常,這里的Supplier用于生成拋出的異常實例。

3. 使用斷言(Assert)

斷言主要用于開發(fā)調(diào)試和內(nèi)部錯誤檢測,不推薦處理業(yè)務(wù)邏輯可預(yù)期錯誤??捎?code>assertNotNull()斷言方法保證傳入?yún)?shù)非空,開發(fā)階段或 JVM 啟用斷言時傳入 null 值會拋出AssertionError,助開發(fā)者盡早發(fā)現(xiàn)問題。但生產(chǎn)環(huá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未禁用,這段代碼將不會觸發(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);
        // 運行時會拋出AssertionError
        processPerson(null);
    }
}
static class Person {
    private String name;
    private String job;
    // 構(gòu)造函數(shù)、getters & setters 省略
}

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

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

    Java中文件的讀寫方法之IO流詳解

    這篇文章主要介紹了Java中文件的讀寫方法之IO流詳解,本文中的代碼所涉及到的路徑或者文件都是本人的,大家得換成自己的,并且大家可以在網(wǎng)上自行找一些材料作為讀入或者寫入的材料,不過路徑最好是英文的,不要包含中文,防止JVM讀取失敗
    2022-04-04
  • SpringBoot種如何使用?EasyExcel?實現(xiàn)自定義表頭導(dǎo)出并實現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換

    SpringBoot種如何使用?EasyExcel?實現(xiàn)自定義表頭導(dǎo)出并實現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換

    本文詳細介紹了如何使用EasyExcel工具類實現(xiàn)自定義表頭導(dǎo)出,并實現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換與添加下拉框操作,通過示例和代碼,展示了如何處理不同數(shù)據(jù)結(jié)構(gòu)和注解,確保數(shù)據(jù)在導(dǎo)出時能夠正確顯示和格式化,此外,還介紹了如何解決特定數(shù)據(jù)類型的轉(zhuǎn)換問題,并提供了解決方案
    2024-11-11
  • 23種設(shè)計模式(2) java工廠模式

    23種設(shè)計模式(2) java工廠模式

    這篇文章主要為大家詳細介紹了23種設(shè)計模式之java工廠模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • java中SPI服務(wù)提供者的接口使用總結(jié)

    java中SPI服務(wù)提供者的接口使用總結(jié)

    SPI英文全稱為Service?Provider?Interface,顧名思義,服務(wù)提供者接口,它是jdk提供給“服務(wù)提供廠商”或者“插件開發(fā)者”使用的接口
    2022-02-02
  • JVM分析之類加載機制詳解

    JVM分析之類加載機制詳解

    JVM內(nèi)部架構(gòu)包含類加載器、內(nèi)存區(qū)域、執(zhí)行引擎等。日常開發(fā)中,我們編寫的java文件被編譯成class文件后,jvm會進行加載并運行使用類。本次將對JVM加載部分進行分析,便于大家了解并掌握加載機制
    2022-08-08
  • Spring?Boot中使用Spring?Retry重試框架的操作方法

    Spring?Boot中使用Spring?Retry重試框架的操作方法

    這篇文章主要介紹了Spring?Retry?在SpringBoot?中的應(yīng)用,介紹了RetryTemplate配置的時候,需要設(shè)置的重試策略和退避策略,需要的朋友可以參考下
    2022-04-04
  • Java中自定義異常詳解及實例代碼

    Java中自定義異常詳解及實例代碼

    這篇文章主要介紹了Java中自定義異常詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 編寫Spring MVC控制器的14個技巧(小結(jié))

    編寫Spring MVC控制器的14個技巧(小結(jié))

    這篇文章主要介紹了編寫Spring MVC控制器的14個技巧,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 詳解Java去除json數(shù)據(jù)中的null空值問題

    詳解Java去除json數(shù)據(jù)中的null空值問題

    這篇文章主要介紹了詳解Java去除json數(shù)據(jù)中的null空值問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • spring @retryable不生效的一種場景分析

    spring @retryable不生效的一種場景分析

    項目中某個位置要調(diào)用其它部門的接口,一直有問題,對方讓加重試,這篇文章主要介紹了spring @retryable不生效的一種場景分析,感興趣的朋友跟隨小編一起看看吧
    2024-07-07

最新評論