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

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

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

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

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

首先檢查person是否為null。只有當(dāng)它不為空時(shí),才會(huì)訪問其成員變量namejob。對(duì)于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;
        }
        // 對(duì)非空對(duì)象進(jìn)行后續(xù)操作
        String job = person.getJob();
        // 需要對(duì)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 的對(duì)象值。傳統(tǒng) Java 開發(fā)中,直接訪問可能為 null 的對(duì)象引用會(huì)導(dǎo)致 NullPointerException。開發(fā)者常手動(dòng)進(jìn)行 null 檢查。Optional 類提供更安全、清晰方式表示和操作可能缺失的對(duì)象,像個(gè)盒子,要么裝著對(duì)象,要么為空。

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);
        // 如果希望在對(duì)象為空時(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對(duì)象,如果傳入的參數(shù)不為null,則包含該參數(shù);如果為null,則創(chuàng)建一個(gè)空的Optional。
  • ifPresent(Consumer):如果Optional中包含非null的值,則執(zhí)行傳入的Consumer接口中的方法。
  • map(Function):對(duì)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ò)誤檢測(cè),不推薦處理業(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) {
        // 測(cè)試代碼
        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)判空檢查:適用于任何場(chǎng)景,但易致代碼冗余和忘檢致空指針,適用于性能敏感或 Optional 不適用的老項(xiàng)目,執(zhí)行重要操作前保證對(duì)象非空。
Optional 類:增強(qiáng)代碼可讀性和安全性,新開發(fā)項(xiàng)目中方法返回值可能為 null 時(shí)適用,可簡(jiǎn)化空值檢查,但過度依賴會(huì)使代碼復(fù)雜,不適合所有場(chǎng)景尤其 API 設(shè)計(jì)。
斷言(Assert):主要用于單元測(cè)試和開發(fā)階段,驗(yàn)證不應(yīng)發(fā)生情況,生產(chǎn)環(huán)境默認(rèn)關(guān)閉,可在單元測(cè)試嚴(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法

    SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法

    這篇文章主要介紹了SpringBoot執(zhí)行定時(shí)任務(wù)@Scheduled的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot基于Shiro處理ajax請(qǐng)求代碼實(shí)例

    SpringBoot基于Shiro處理ajax請(qǐng)求代碼實(shí)例

    這篇文章主要介紹了SpringBoot基于Shiro處理ajax請(qǐng)求代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Mybatis-Plus使用@TableField實(shí)現(xiàn)自動(dòng)填充日期的代碼示例

    Mybatis-Plus使用@TableField實(shí)現(xiàn)自動(dòng)填充日期的代碼示例

    數(shù)據(jù)庫(kù)中經(jīng)常有create_time,update_time兩個(gè)字段,在代碼中設(shè)置時(shí)間有點(diǎn)太麻煩了?mybatis-plus可以幫我們自動(dòng)填充,本文主要介紹了Mybatis-Plus使用@TableField實(shí)現(xiàn)自動(dòng)填充日期的代碼示例,感興趣的可以了解一下
    2022-04-04
  • Java實(shí)現(xiàn)根據(jù)模板讀取PDF并替換指定內(nèi)容

    Java實(shí)現(xiàn)根據(jù)模板讀取PDF并替換指定內(nèi)容

    在實(shí)際開發(fā)里,經(jīng)常會(huì)遇到需要根據(jù)?PDF?模板文檔生成特定?PDF?的需求,本文將利用Java中的iText實(shí)現(xiàn)讀取?PDF?模板文檔并替換指定內(nèi)容,最后重新生成新PDF,感興趣的可以了解下
    2025-02-02
  • mybatis insert 返回自增主鍵的實(shí)現(xiàn)示例

    mybatis insert 返回自增主鍵的實(shí)現(xiàn)示例

    mybatis 在新增之后怎么也獲取不到自增主鍵,本文主要介紹了mybatis insert 返回自增主鍵的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • java之static關(guān)鍵字用法實(shí)例解析

    java之static關(guān)鍵字用法實(shí)例解析

    這篇文章主要介紹了java之static關(guān)鍵字用法實(shí)例解析,包括了static關(guān)鍵字的原理講解及用法分析,并附帶了實(shí)例說明,需要的朋友可以參考下
    2014-09-09
  • mybatis批量update時(shí)報(bào)錯(cuò)multi-statement not allow的問題

    mybatis批量update時(shí)報(bào)錯(cuò)multi-statement not allow的問題

    這篇文章主要介紹了mybatis批量update時(shí)報(bào)錯(cuò)multi-statement not allow的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Spring入門實(shí)戰(zhàn)之Profile詳解

    Spring入門實(shí)戰(zhàn)之Profile詳解

    什么是spring profile?簡(jiǎn)單講profile就是一組配置,不同profile提供不同組合的配置,程序運(yùn)行時(shí)可以選擇使用哪些profile來適應(yīng)環(huán)境。下面這篇文章主要介紹了Spring中Profile實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考借鑒。
    2017-02-02
  • Java使用枚舉替代if/else和switch-case語(yǔ)句的實(shí)踐

    Java使用枚舉替代if/else和switch-case語(yǔ)句的實(shí)踐

    在軟件開發(fā)中if-else和switch-case語(yǔ)句經(jīng)常被用來處理不同的條件分支,但在大型項(xiàng)目中,這種做法可能導(dǎo)致代碼可讀性差、維護(hù)困難,這篇文章主要給大家介紹了關(guān)于Java使用枚舉替代if/else和switch-case語(yǔ)句的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • Java集合框架概覽之ArrayList源碼刨析

    Java集合框架概覽之ArrayList源碼刨析

    本文主要從一個(gè)簡(jiǎn)單的代碼入手,對(duì)ArrayList?的最常用的源碼進(jìn)行刨析,文中源碼摘自?JDK1.8,源碼的注釋部分博主也加入了自己的翻譯,歡迎讀者食用
    2023-03-03

最新評(píng)論