詳解Java中NullPointerException的處理方法
一. 簡介
你要問,Java中哪個異常最有名,那就不得不說NullPointerException!
NullPointerException,空指針異常,簡稱為NPE。這對Java程序員來說,可以說是一個無人不知、無人不曉的異常了!空指針異常往往是由于程序員沒有考慮到變量或者對象的值可能為null,或者沒有對null值進行判斷導致的。所以當我們試圖訪問null對象或者是對null對象進行操作時,就會拋出NullPointerException異常。
NullPointerException異常在運行時被拋出,如果不加以處理,會導致程序的中斷或者崩潰,因此我們在編寫Java程序時,要格外注意避免空指針異常的發(fā)生。
二. 產(chǎn)生原因
之所以會出現(xiàn)NullPointerException空指針異常,最根本的原因只有一個,那就是”對象為空“ ,這和很多單身狗的毛病一樣。也就是說,當一個對象為null時,你還非得調(diào)用該對象的方法或字段,此時JVM就會產(chǎn)生NullPointerException,例如:
public static void main(String[] args) {
String s = null;
System.out.println(s.toUpperCase());
}當上面這段代碼運行時,肯定會產(chǎn)生空指針異常,因為對象”s“是null。也就是我們沒有給該對象初始化賦值,它就是一個空殼子,你還非要使用它,這時就會出事。
三. 典型情況
雖然我們現(xiàn)在已經(jīng)知道引發(fā)空指針異常的原因了,但為了讓大家避免這種常見的異常,還是想給大家列舉幾個會引發(fā)空指針異常的典型情況。
3.1 對空對象調(diào)用方法或訪問屬性
當一個對象為null時,它就沒有任何屬性和方法,如果我們在這個空對象上調(diào)用方法或訪問屬性,就會引發(fā)空指針異常。例如:
String str = null; int length = str.length(); // 會拋出空指針異常
3.2 數(shù)組元素為null
在Java中,數(shù)組中的元素也可能會為null。如果我們在一個null數(shù)組元素上調(diào)用方法或訪問屬性,同樣會拋出空指針異常。例如:
String[] strs = new String[3]; strs[0] = "Hello"; strs[1] = null; int length = strs[1].length(); // 會拋出空指針異常
3.3 參數(shù)為null
在調(diào)用方法時,如果參數(shù)為null,而方法內(nèi)部卻需要使用這個參數(shù),也會拋出空指針異常。例如:
public void printString(String str) {
System.out.println(str.length());
}
String str = null;
printString(str); // 會拋出空指針異常四. 解決辦法
為了避免空指針異常的發(fā)生,我們需要加強對變量和對象的判斷,如果發(fā)現(xiàn)其值為null,就需要及早進行處理,例如設置默認值或者拋出異常。我們要知道,NullPointerException其實是一種代碼邏輯錯誤,遇到NullPointerException,要遵循”早暴露、早修復“的原則,不要使用catch語句來隱藏這種編碼錯誤! 比如下面這樣的代碼就不行:
// 錯誤示例: 捕獲NullPointerException
try {
transferMoney(from, to, amount);
} catch (NullPointerException e) {
//不要去捕獲空指針異常!
}接下來給大家列舉幾個常用的避免空指針異常的方法。
4.1 使用條件判斷語句
通過判斷變量是否為null,可以避免空指針異常的發(fā)生。例如:
String str = null;
if (str != null) {
int length = str.length();
}4.2 使用對象初始化語句
我們在使用對象之前,確保要對該對象進行初始化,這樣就可以保證對象不為null。例如:
String str = ""; int length = str.length();
我們在編寫業(yè)務邏輯時,使用空字符串""表示未填寫,而不要用默認的null,""空串要比null安全得多,這可以避免很多NullPointerException。
4.3 使用Objects.requireNonNull()方法
Objects.requireNonNull()方法可以判斷參數(shù)是否為null,如果是null,則會拋出NullPointerException異常。例如:
String str = null; Objects.requireNonNull(str, "str不能為空"); // 會拋出NullPointerException異常
4.4 返回空數(shù)組
如果我們使用數(shù)組時,某個數(shù)組沒有數(shù)據(jù),此時可以返回一個元素為空的數(shù)組,但是不要返回null,比如:
public String[] getData(String item) {
if (getItem(item) == 0) {
// 返回空數(shù)組而不是null:
return new String[0];
}
...
}這樣調(diào)用方就不用檢查結果是否為null。
4.5 使用Optional
Optional是Java 8中引入的一個非常有用的類,用于解決null值問題。它是一個容器對象,可能包含非空值或空值,主要目的是減少代碼中的空指針異常,當調(diào)用方一定要判斷某個對象是否為null時,就可以考慮使用Optional。接下來給大家編寫一個簡單的Optional案例。
import java.io.IOException;
import java.util.Optional;
/**
* @author 一一哥Sun
*/
public class Demo13 {
public static void main(String[] args) throws IOException {
String str="一一哥";
//創(chuàng)建一個包含非空值的Optional對象。如果傳入的值為null,則會拋出NullPointerException異常。
Optional<String> optional = Optional.of(str);
if(optional.isPresent()) {
String value = optional.get();
System.out.println("value="+value);
}else {
System.out.println("字符串為空");
}
//ofNullable方法
String name = null;
//Optional.ofNullable靜態(tài)工廠方法,創(chuàng)建一個包含指定值的Optional對象,如果傳入的值為null,則返回一個空的Optional對象
Optional<String> optionalName = Optional.ofNullable(name);
String orElse = optionalName.orElse("Unknown");
System.out.println("值="+orElse);
}
}我們可以使用 Optional.of 靜態(tài)工廠方法來創(chuàng)建一個包含非空值的 Optional 對象,如果傳入的值為 null,則會拋出 NullPointerException 異常。并可以使用 isPresent() 方法來判斷 Optional 對象是否包含非空值。如果包含非空值,則返回 true,否則返回 false。
也可以使用 Optional.ofNullable 靜態(tài)工廠方法,來創(chuàng)建一個包含指定值的 Optional 對象,如果傳入的值為 null,則會返回一個空的 Optional對象。然后使用 orElse() 方法來獲取 Optional 對象中包含的值,如果 Optional 對象為空,則返回指定的默認值。
關于Optional的用法還有很多,以后會出一個Java新特性的專題系列,這里就不再細說了,敬請期待哦。
4.6 定位空指針異常
當我們編寫的代碼真的產(chǎn)生了空指針異常,那該怎么辦呢?前面就跟大家說過,產(chǎn)生空指針異常的根本原因就是因為”對象為空“,所以解決的辦法就是先找到這個為空的對象,然后給這個對象賦值,只要對象不為空,這個空指針異常就解決了。聽起來也不難,但真的開發(fā)時,有時候經(jīng)驗不豐富的程序員,可能一時半會還找不到是哪個對象為空了。因為我們的項目中,對象實在太多了!比如下面這樣的代碼:
a.b.c.method()
這里的a、b、c都是對象,假如就是這一行代碼產(chǎn)生了空指針,你說到底是哪個對象為空?有可能是a為空,也有可能是b,也有可能是c,通常我們得一個對象一個對象進行判斷,比如通過打印日志進行判斷:
System.out.println(a); System.out.println(a.b); System.out.println(a.b.c);
但是這樣寫代碼,就顯得啰嗦且低效!為了改善這種問題,在JDK 14中推出了新的API,JVM可以直接給出詳細的信息,告訴我們null對象到底是哪個。在JDK 14中,如果是上面的代碼產(chǎn)生了空指針異常,會出現(xiàn)這樣的提示信息:... because "....a.b" is null....意思是b對象為null。但該功能默認是關閉的,我們需要給JVM添加一個-XX:+ShowCodeDetailsInExceptionMessages參數(shù)啟用它,如下:
java -XX:+ShowCodeDetailsInExceptionMessages Main.java
以上就是列舉出來的幾種避免及檢查空指針異常的常用方法,希望你可以掌握。
總之,我們在編寫Java程序時,要格外注意避免空指針異常的發(fā)生,加強對變量和對象的判斷,養(yǎng)成良好的編碼習慣,就可以極大地降低NullPointerException的產(chǎn)生。如果發(fā)現(xiàn)值為null,就需要及早進行處理,避免程序中斷或者崩潰。
五. 結語
這樣,就把空指針這種特別常見的異常單獨給大家分析了一下,希望大家以后遇到這種異常能夠知道怎么解決。今天的重點內(nèi)容如下:
- NullPointerException的根本原因是對象為空;
- 對空指針異常要早暴露,早修復,不要使用catch進行捕獲;
- 可以啟用Java 14的增強異常來定位空指針異常的產(chǎn)生位置。
以上就是詳解Java中NullPointerException的處理方法的詳細內(nèi)容,更多關于Java NullPointerException處理的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot+Mybatis plus實現(xiàn)多數(shù)據(jù)源整合的實踐
本文主要介紹了SpringBoot+Mybatis plus實現(xiàn)多數(shù)據(jù)源整合的實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
Maven的配置文件pom.xml詳解(含常用plugin)
pom.xml是Maven項目的核心配置文件,它是 項目對象模型 - Project Object Model(POM)的縮寫,本文我們將全面解析pom.xml,了解其結構和屬性,以及如何使用它來管理項目,感興趣的朋友跟隨小編一起看看吧2024-08-08
使用Jackson來實現(xiàn)Java對象與JSON的相互轉換的教程
這篇文章主要介紹了使用Jackson來實現(xiàn)Java對象與JSON的互相轉換的教程,文中羅列了3中Jackson的使用方式,需要的朋友可以參考下2016-01-01
詳解SpringBoot2 使用Spring Session集群
這篇文章主要介紹了SpringBoot2 使用Spring Session集群,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-04-04

