1

arrayを勉強しようとしています。私は非常に多くの多次元配列を試しましたが、理解しませんでした2次元の異なるフレーバータイプの配列の違いは?これらの2つのタイプの利点

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); 
    } 
} 

この例では、2つの二次元配列を試しました。

String [][] obj1 = new String [10][5];およびString [][] obj2 = new String [10][];。今

System.out.println(obj1[1].length);は出力として長さ5を与えます。完全にクリアされました。第二に、SYSOUT文で

NullPointerException

System.out.println(obj2[1].length);完全未確認スローします。私はメンバ変数にアクセスしようとしていないので、長さを取得したいだけです。

だから、なぜNullPointerExceptionここですか? は実際に配列の宣言の第二のタイプの利点はありますか?

詳細については、いくつかのソースが見つかりましたが、混乱しています。

おかげString [][] obj2 = new String [10][];

+0

ギザギザのアレイで読み上げてください。 – Savior

答えて

4

あなたは10個のString[]要素の配列を参照するためにobj2を初期化しています。配列の要素はnullに初期化されます。そのため、obj2[1].lengthNullPointerExceptionをスローします。

このタイプの宣言では、異なる長さの配列を2D配列に割り当てることができます。

例えば:

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

あなたは10個のString[]要素の配列を参照するためにobj1を初期化され、ここため

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

にすべての内部配列は、5の同じ長さを有しながら、各要素は、5 String要素の配列を参照するように初期化されています。第二に、SYSOUT文で

+0

1つの混乱が依然として存在し、なぜlengthが 'nullPointer'を与えるのか、それは' 0'のサイズを反映するかもしれません。 –

+0

@VikrantKashyap 'obj2 [1]'はnullなので、 'obj2 [1] .length'はnull参照を間接参照しようとするように' NullPointerException'を返します。 – Eran

1

は、それが初期化されていないとして、あなたが期待するNullPointerExceptionが

をスローします。

メンバー変数にアクセスしようとしていません。長さを取得したいだけです。

このような配列を作成したり、長さを与えたりしていないので意味がありません。

実際には、2番目のタイプの配列宣言の利点はありますか?

すべての配列の長さを同じにしたくない場合は、それぞれの長さを任意の長さに設定できます。