Java空指針異常處理之判空、Optional與Assert解析
在Java編程中,空指針異常(NullPointerException)是最常見(jiàn)的運(yùn)行時(shí)錯(cuò)誤之一。本文將深入探討三種處理空指針異常的方法:傳統(tǒng)的判空檢查、Java 8引入的Optional類以及使用斷言(Assert)。通過(guò)代碼示例和應(yīng)用場(chǎng)景分析,幫助開(kāi)發(fā)者理解并選擇最適合的方案以提升程序健壯性。
1. 傳統(tǒng)判空檢查
首先檢查person
是否為null。只有當(dāng)它不為空時(shí),才會(huì)訪問(wèn)其成員變量name
和job
。對(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 開(kāi)發(fā)中,直接訪問(wèn)可能為 null 的對(duì)象引用會(huì)導(dǎo)致 NullPointerException
。開(kāi)發(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())); // 或者通過(guò)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中有值,則返回該值;若沒(méi)有值,則拋出自定義異常,這里的Supplier用于生成拋出的異常實(shí)例。
3. 使用斷言(Assert)
斷言主要用于開(kāi)發(fā)調(diào)試和內(nèi)部錯(cuò)誤檢測(cè),不推薦處理業(yè)務(wù)邏輯可預(yù)期錯(cuò)誤??捎?code>assertNotNull()斷言方法保證傳入?yún)?shù)非空,開(kāi)發(fā)階段或 JVM 啟用斷言時(shí)傳入 null 值會(huì)拋出AssertionError
,助開(kāi)發(fā)者盡早發(fā)現(xiàn)問(wèn)題。但生產(chǎn)環(huán)境默認(rèn)關(guān)閉斷言,不能依賴此避免空指針異常。
import static org.junit.Assert.assertNotNull; public class AssertExample { public void processPerson(Person person) { // 在開(kāi)發(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)代碼可讀性和安全性,新開(kāi)發(fā)項(xiàng)目中方法返回值可能為 null 時(shí)適用,可簡(jiǎn)化空值檢查,但過(guò)度依賴會(huì)使代碼復(fù)雜,不適合所有場(chǎng)景尤其 API 設(shè)計(jì)。
斷言(Assert):主要用于單元測(cè)試和開(kāi)發(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)問(wè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種如何使用?EasyExcel?實(shí)現(xiàn)自定義表頭導(dǎo)出并實(shí)現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換
本文詳細(xì)介紹了如何使用EasyExcel工具類實(shí)現(xiàn)自定義表頭導(dǎo)出,并實(shí)現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換與添加下拉框操作,通過(guò)示例和代碼,展示了如何處理不同數(shù)據(jù)結(jié)構(gòu)和注解,確保數(shù)據(jù)在導(dǎo)出時(shí)能夠正確顯示和格式化,此外,還介紹了如何解決特定數(shù)據(jù)類型的轉(zhuǎn)換問(wèn)題,并提供了解決方案2024-11-11Spring?Boot中使用Spring?Retry重試框架的操作方法
這篇文章主要介紹了Spring?Retry?在SpringBoot?中的應(yīng)用,介紹了RetryTemplate配置的時(shí)候,需要設(shè)置的重試策略和退避策略,需要的朋友可以參考下2022-04-04編寫Spring MVC控制器的14個(gè)技巧(小結(jié))
這篇文章主要介紹了編寫Spring MVC控制器的14個(gè)技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11詳解Java去除json數(shù)據(jù)中的null空值問(wèn)題
這篇文章主要介紹了詳解Java去除json數(shù)據(jù)中的null空值問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08spring @retryable不生效的一種場(chǎng)景分析
項(xiàng)目中某個(gè)位置要調(diào)用其它部門的接口,一直有問(wèn)題,對(duì)方讓加重試,這篇文章主要介紹了spring @retryable不生效的一種場(chǎng)景分析,感興趣的朋友跟隨小編一起看看吧2024-07-07