博客 / 詳情

返回

如何修復NullPointerException異常

java.lang.NullPointerException 是JAVA中最容易出現的異常,也是非常困擾編程新手的問題。本文對空指針異常的發生原因進行説明,並對如何解決空指針異常給出了快捷方法。

什麼是空指針異常

NullPointerExceptions 是當您嘗試使用未指向任何對象的引用時,發生的異常。對空引用調用方法或嘗試訪問空引用的字段將觸發NullPointerException。比如如下代碼:

public class Dm2box {
    public static void main(String[] args) {
        Object obj;
        obj.hashCode();
    }
}

上述代碼會在會在obj.hashCode()執行時拋出空指針異常,其原因是obj變量還未指向任何實例對象。

第二行聲明瞭一個類型為Object的變量obj,但它實際上並不包含原始值,只包含一個指針,由於您還沒有説要指向什麼,Java 將其設置為null,這意味着“我沒有指向任何內容”。在第三行進行hashCode()方法執行時,由於該變量併為指向實際內存中的對象,所以會導致無法執行任何方法並拋出空指針異常。

上述這就像在一個班級中,還沒有讓學生就坐,卻讓第一排第一列座位上的學生回答問題,這時座位上還沒有對應的學生,自然也就無法有人回答問題,最終導致回答問題這個行為因為座位上無人從而無法執行。如上的例子中,班級就是內存空間;學生就是內存中的對象;座位編號就是變量obj;回答問題就是hashCode()方法;沒有對應人能夠執行問題回答就是空指針異常。

編寫時如何避免

因為NullPointerExceptions繼承自RuntimeExcetion,所以其無需在方法聲明中進行明確描述。在源碼編譯時編譯器也無法對此類未聲明的異常進行檢查,僅能通過在編寫時儘量避免其異常的發生。故在編寫時需要遵循以下原則進行編寫,達到避免的目的:

  • 所有變量在聲明後應當儘快指向對應引用對象,在未指向明確引用對象時不對該變量進行任何操作。
  • 在public方法定義時,所有入參應當進行必要的非空檢查,如果為空拋出有含義的異常或指向明確的對象繼續後續執行。private方法因為無法被其他類進行直接引用,是否需要檢查可以根據實際情況來看。

異常發生後診斷

在Java1.4之後對於空指針異常會給出明確提示,如下:

in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.size()" because "list" is null

根據異常提示可以快速定位到具體的發生異常的調用棧信息定位到具體的源碼行,再根據異常信息中提示的變量名就可以快速找到異常點。參照上個章節進行處理即可。

版權聲明,本文首發於 數字魔盒 https://www.dm2box.com/ 歡迎轉載。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.