別再寫 bug 了,避免空指針的 5 個案例

空指針是我們 Java 開發人員經常遇到的一個基本異常,這是一個極其普遍但似乎又無法根治的問題。

本文,棧長將帶你瞭解什麼是空指針,還有如何有效的避免空指針。

什麼是空指針?

當一個變量的值為 null 時,在 Java 裡面表示一個不存在的空對象,沒有實際內容,沒有給它分配內存,null 也是對象成員變量的默認值。

所以,一個對象如果沒有進行初始化操作,這時候,如果你調用這個對象的方法或者變量,就會出現空指針異常。

如下面示例會發生空指針異常:

<code>Objectobject=null;
Stringstring=object.toString();
/<code>
別再寫 bug 了,避免空指針的 5 個案例

從類結構圖來看,空指針它是屬於運行時異常 RuntimeException 的子類,它不是捕獲型的,只有在程序運行時才可能報出來,而且會造成程序中斷。

什麼是運行時異常及異常的分類請看這篇文章:一張圖搞清楚 Java 異常機制。

如何避免空指針?

下面說幾個空指針的幾個最常見的案例及解決之道。

1、字符串比較,常量放前面

<code>if(status.equals(SUCCESS)){

}
/<code>

這個時候 status 可能為 null 造成空指針異常,應該把常量放前面,就能避免空指針異常。

<code>if(SUCCESS.equals(status)){

}
/<code>

這個應該在各種開發規範裡面都會提到,也是最基礎的。

2、初始化默認值

在對象初始化的時候給它一個默認值或者默認構造實現,如:

<code>Useruser=newUser();
Stringname=StringUtils.EMPTY;
/<code>

3、返回空集合

在返回一個集合的話,默認會是 null,統一規範返回一個空集合。

舉個 List 例子,如:

<code>publicListgetUserList(){
Listlist=userMapper.gerUserList();
returnlist==null?newArrayList():list;
}
/<code>

這樣接收方就不用擔心空指針異常了,也不會影響業務。

4、斷言

斷言是用來檢查程序的安全性的,在使用之前進行檢查條件,如果不符合條件就報異常,符合就繼續。

Java 中自帶的斷言關鍵字:assert,如:

<code>assertname==null:"名稱不能為空";
/<code>

輸出:

<code>Exceptioninthread"main"java.lang.AssertionError:名稱不正確
/<code>

不過默認是不啟動斷言檢查的,需要要帶上 JVM 參數:-enableassertions 才能生效。

Java 中這個用的很少,建議使用 Spring 中的,更強大,更方便好用。

Spring中的用法:

<code>Assert.notNull(name,"名稱不能為空");
/<code>

5、Optional

Optional 是 JDK 8 新增的新特性,再也不用 != null 來判斷了,這個在一個對象裡面的多個子對象連續判斷的時候非常有用。

這裡不再詳細介紹了,具體看這篇文章:JDK8新特性之Optional。

這裡大概介紹了 5 種,其實還有更多,如何避免空指針,一是要注意代碼編寫規範,二是要提高代碼素養。

我是一名從事多年開發的java老程序猿員,目前辭職在做自己的java私人訂製課程,今年年初我花了一個月整理了一份最適合2019年學習的java學習乾貨資料,從最基礎的javase到spring各種框架都有整理,送給每一位java小夥伴,想要獲取的可以關注我的頭條號並在後臺私信我:02,即可免費獲取。

鏈接:https://url.cn/5YvbCVg


分享到:


相關文章: