空指針是咱們 Java 開發人員常常遇到的一個基本異常,這是一個極其廣泛但彷佛又沒法根治的問題。java
本文,棧長將帶你瞭解什麼是空指針,還有如何有效的避免空指針。安全
當一個變量的值爲 null 時,在 Java 裏面表示一個不存在的空對象,沒有實際內容,沒有給它分配內存,null 也是對象成員變量的默認值。app
因此,一個對象若是沒有進行初始化操做,這時候,若是你調用這個對象的方法或者變量,就會出現空指針異常。指針
以下面示例會發生空指針異常:code
Object object = null; String string = object.toString();
從類結構圖來看,空指針它是屬於運行時異常 RuntimeException
的子類,它不是捕獲型的,只有在程序運行時纔可能報出來,並且會形成程序中斷。對象
什麼是運行時異常及異常的分類請看這篇文章:一張圖搞清楚 Java 異常機制。blog
下面說幾個空指針的幾個最多見的案例及解決之道。內存
if(status.equals(SUCCESS)){ }
這個時候 status 可能爲 null 形成空指針異常,應該把常量放前面,就能避免空指針異常。ci
if(SUCCESS.equals(status)){ }
這個應該在各類開發規範裏面都會提到,也是最基礎的。開發
在對象初始化的時候給它一個默認值或者默認構造實現,如:
User user = new User(); String name = StringUtils.EMPTY;
在返回一個集合的話,默認會是 null,統一規範返回一個空集合。
舉個 List 例子,如:
public List getUserList(){ List list = userMapper.gerUserList(); return list == null ? new ArrayList() : list; }
這樣接收方就不用擔憂空指針異常了,也不會影響業務。
斷言是用來檢查程序的安全性的,在使用以前進行檢查條件,若是不符合條件就報異常,符合就繼續。
Java 中自帶的斷言關鍵字:assert,如:
assert name == null : "名稱不能爲空";
輸出:
Exception in thread "main" java.lang.AssertionError: 名稱不正確
不過默認是不啓動斷言檢查的,須要要帶上 JVM 參數:-enableassertions 才能生效。
Java 中這個用的不多,建議使用 Spring 中的,更強大,更方便好用。
Spring中的用法:
Assert.notNull(name,"名稱不能爲空");
Optional 是 JDK 8 新增的新特性,不再用 != null 來判斷了,這個在一個對象裏面的多個子對象連續判斷的時候很是有用。
這裏再也不詳細介紹了,具體看這篇文章:JDK8新特性之Optional。
這裏大概介紹了 5 種,其實還有更多,如何避免空指針,一是要注意代碼編寫規範,二是要提升代碼素養。在Java技術棧公衆號後臺回覆關鍵字:Java,能夠獲取更多棧長整理的 Java 系列技術乾貨。
你們都有什麼高見,歡迎留言分享!
本文原創首發於公衆號:Java技術棧(id:javastack),關注公衆號在後臺回覆 "Java" 可獲取更多,轉載請原樣保留本信息。