Java空指針異常的幾種情況

                          Java空指針異常的幾種情況

NullPointerException

說法一

NullPointerException由RuntimeException派生出來,是一個運行級別的異常。意思是說可能會在運行的時候纔會被拋出,而且需要看這樣的運行級別異常是否會導致你的業務邏輯中斷。

編程語言中的空指針異常。

1 當應用程序試圖在需要對象的地方使用 null 時,拋出該異常。這種情況包括:

  • 調用 null 對象的實例方法。

  • 訪問或修改 null 對象的字段。

  • 將 null 作爲一個數組,獲得其長度。

  • 將 null 作爲一個數組,訪問或修改其時間片。

  • 將 null 作爲 Throwable 值拋出。

出現在任何一個位置上的對象引用都有可能爲 null,在進行訪問,賦值,取值,類型轉換等操作時,首先判斷該對象是否爲 null,否則極易拋出空指針異常; 

2 比如變量爲空,而你沒有去判斷,就直接使用,就會出現NullPointException。寫程序時嚴謹些,儘量避免了,例如在拿該變量與一個值比較時,要麼先做好該異常的處理如: if (str == null) {   System.out.println("字符爲空!"); } 當然也可以將這個值寫在前面進行比較的,例如,判斷一個String的實例s是否等於“a”,不要寫成s.equals("a"),這樣寫容易拋出NullPointerException,而寫成"a".equals(s)就可以避免這個問題。不過對變量先進行判空後再進行操作比較好

 

 

說法二

1. Calling the instance method of a null object. 
2. Accessing or modifying the field of a null object. 
3. Taking the length of null as if it were an array. 
4. Accessing or modifying the slots of null as if it were an array. 
5. Throwing null as if it were a Throwable value. 

-------------------------
 

1:NullPointerException由RuntimeException派生出來,是一個運行級別的異常。意思是說可能會在運行的時候纔會被拋出,而且需要看這樣的運行級別異常是否會導致你的業務邏輯中斷。
 2:空指針異常發生在對象爲空,但是引用這個對象的方法。例如: String s = null; //對象s爲空(null) int length = s.length();//發生空指針異常  
 3:一個變量是null,及只有其名,沒有實值內容,也沒分配內存,當你要去取他的長度,對他進行操作就會出現NullPointException,所以生命一個變量時最好給它分配好內存空間,給予賦值。  
  4:比如變量爲空,而你沒有去判斷,就直接使用,就會出現NullPointException。寫程序時嚴謹些,儘量避免了,例如在拿該變量與一個值比較時,要麼先做好該異常的處理如: if (str == null) {   System.out.println("字符爲空!"); } 當然也可以將這個值寫在前面進行比較的,例如,判斷一個String的實例s是否等於“a”,不要寫成s.equals("a"),這樣寫容易拋出NullPointerException,而寫成"a".equals(s)就可以避免這個問題。不過對變量先進行判空後再進行操作比較好  
 5:儘量避免返回null,方法的返回值不要定義成爲一般的類型,而是用數組。這樣如果想要返回null的時候,就返回一個沒有元素的數組。就能避免許多不必要的NullPointerException,使用NullObject返回代替返回null確是一種不錯的選擇。 

 

如何避免空指針?

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

if(status.equals(SUCCESS)){

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

if(SUCCESS.equals(status)){

}

2、初始化默認值

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

User user = new User();
String name = StringUtils.EMPTY;

3、返回空集合

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

舉個 List 例子,如:

public List getUserList(){
    List list = userMapper.gerUserList();
    return list == null ? new ArrayList() : list;
}
這樣接收方就不用擔心空指針異常了,也不會影響業務。

4、斷言

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

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

assert name == null : "名稱不能爲空";
輸出:

Exception in thread "main" java.lang.AssertionError: 名稱不正確
不過默認是不啓動斷言檢查的,需要要帶上 JVM 參數:-enableassertions 才能生效。

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

Spring中的用法:

Assert.notNull(name,"名稱不能爲空");

5、Optional

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章