2017-12-03 7 views
6
int[][] a = new int[0][5]; 

なぜ上記のコードがjavaで有効ですか?なぜJavaで0行5列の2次元配列を作成できますか?

この2次元配列は、最初の次元がゼロであるため、ほとんど役に立ちません。 論理的には、最初の次元が0の場合、2番目の次元は0より大きくはなりません。

私は1dの空の配列を開始できます。

+2

? – NickL

+1

もっと簡単です: 'int [] a =新しいint [0];' –

答えて

6

By the JLSの場合、0のサイズを示す配列式が有効です。これは単なる式なので、は法的ににカーディナリティがゼロであることを宣言できます。

(Javaの8のような)JLSのレクサー・チェックがwhether or not the expression evaluates to zeroであることを唯一のもの:

次に、次元式の値がチェックされます。 DimExpr式の値が0より小さい場合は、NegativeArraySizeExceptionがスローされます。

これは、インデックスの場所がゼロから始まるため、ArrayIndexOutOfBoundsExceptionを生成するため、この配列にインデックスを作成しようとすると、その有用性は何もわかりません。

+0

あなたは私の質問を理解しました。答えをありがとう。基本的に文法は許していますが、この2次元配列は無用です。 –

-2

5つの空の配列の配列を作成するだけなので、これは完全に合法です。

int[][] arr_ = {{}, {}, {}, {}, {}};

+2

いいえ、int [5] [0]の配列を宣言しました。最もふさわしいパラメータは、リテラル式の最も内側の配列に対応します。 –

2

通常何かのように空の配列として考えるのは奇妙なことではないはずです。常に空の配列を処理するのは非常に似たケースです。

List<String> names = new ArrayList<String>(); 

namesは現在空の配列です。常に少なくとも最初の要素を持つ配列を宣言するのは奇妙ではないでしょうか?

List<String> names = new ArrayList<String>(Arrays.asList("John")); 

new int[0]は有効な構文であることに代わりは最初の要素が使用できない場合にnullに配列を設定することです。この世界では、配列を反復する前に定期的にnullをチェックすることが期待されます。ループのための定期的な空の配列なし

int[] nums = null; // Because empty primitive arrays are "weird" 

//typical for-each loop 
if(nums != null){ 
    for(int x: nums){ 
     // do something 
    } 
} 
//typical for loop 
if(nums != null){ 
    for(int c = 0; c < nums.length; c++){ 
     // do something 
    } 
} 

は、NullPointerExceptionのすべての時間をスローしていました。言われたことは、new int[0][]の代わりにnew int[0][5]を使うのは変です。私はそれが構文エラーの価値はないと思うが、私はそれがIDEからこれらのいずれかに値すると思う:空の配列がvallidされているので

warning light

関連する問題