2015-08-24 149 views
1
public class Learner { 
    public static void main(String[] args) { 
     String[] dataArr = new String[4]; 
     dataArr[1] = "Bill"; 
     dataArr[2] = "Steve"; 
     dataArr[3] = "Larry"; 
     try{ 
      for(String data : dataArr){ 
       System.out.print(data+" "); 
      } 
     }catch(Exception e){ 
      System.out.println(e.getClass()); 
     } 
    } 
} 

書中指出這將打印: 空比爾史蒂夫拉里空或拋出異常

這混淆了我,因爲我以爲訪問與空的任何數據都將拋出NullPointerException。有沒有什麼時候訪問一個具有空值的數組時引發異常?

或者是system.out.println(),保存寬限期嗎?你可以使用for循環訪問任何空值,只要你不是說調用data.length()就可以了?

+3

你可以「處理」一個空引用,你不能調用它的方法。 –

回答

4

字符串連接在JLS定義爲安全操作時的操作數是一個空引用,即,它不拋出任何異常(這將是,如果它試圖描述與.toString()對象的情況下)和必須使用文字"null"

安全檢查運行時,需要拆箱:

Integer val = null; 
int err = val + 1; // throws NPE 

只是出於好奇,訪問一個空引用任何靜態方法甚至不需要檢查,因爲綁定發生在編譯時:

public class NullRefStatic { 

    public static void test() { // <-- static method 
     System.out.println("It works"); 
    } 

    public static void main(String... args) { 
     NullRefStatic target = null; 
     target.test(); // <-- Prints "It works" 
    } 
} 
+0

所以我猜這是我將不得不從經驗中學習的東西,是哪些方法是在空對象上執行的安全操作 – mc805

+1

其實更容易:訪問空引用**總是**拋出NPE。字符串連接只在**調用toString() – Raffaele

+0

之前檢查**。因此,打印內置了一個空檢查,但通常期望NPE。說得通。靜態方法也是有趣的信息。 – mc805

0

因此,它打印出對象的值,在這種情況下它將爲null。

如果您嘗試使用它的函數或訪問任何屬性,則會發生空指針異常,因爲它們還不存在,因此會出現空指針異常。