2016-04-10 65 views
1

我正在努力深入研究array。我嘗試了很多多維數組但是不明白二維不同風味類型數組之間的區別?這兩種類型的優點

class Test 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 

     String [][] obj1 = new String [10][5]; 
     String [][] obj2 = new String [10][]; 

     System.out.println(obj1[1].length); 
     System.out.println(obj2[1].length); 
    } 
} 

在這個例子中,我嘗試了兩個二維數組。

String [][] obj1 = new String [10][5];String [][] obj2 = new String [10][];

現在

System.out.println(obj1[1].length);給出了長度5作爲輸出。完全清除。

在第二系統輸出語句拋出NullPointerException

System.out.println(obj2[1].length);完全未清除。因爲我不想訪問成員變量只想獲得長度。

那麼,爲什麼NullPointerException在這裏?是否有真的有什麼優勢第二類數組聲明?

請詳細解釋一下,發現有幾個來源,但還是感到困惑。

由於

+0

閱讀鋸齒狀陣列。 – Savior

回答

4

String [][] obj2 = new String [10][];要初始化obj2,指10個String[]元素的數組。陣列的元素被初始化爲null,這就是爲什麼obj2[1].length會拋出NullPointerException

這種類型的聲明允許您在2D數組中分配不同長度的數組。

例如:

obj2[0] = new String[5]; 
obj2[1] = new String[10]; 

而在

String [][] obj1 = new String [10][5]; 

所有內部陣列具有5相同的長度,因爲在這裏要初始化obj1,指10個String[]元件的陣列,其中的每一個都被初始化爲指代5個元素的數組。

+0

一個混淆仍然存在,爲什麼長度給'nullPointer'它可能反映了'0'的大小。 –

+0

@VikrantKashyap'obj2 [1]'爲null,所以'obj2 [1] .length'給出'NullPointerException',就像任何試圖解引用空引用一樣。 – Eran

1

在第二系統輸出語句引發NullPointerException異常

你所期望的,因爲它一直沒有INITIALISE。

我不想訪問成員變量只想獲得長度。

你沒有創建任何這樣的數組或給它一個長度,所以這沒有意義。

第二種數組聲明真的有什麼好處?

您可能不希望所有數組具有相同的長度,在這種情況下,您可以將每個數組設置爲任意長度。