たとえば、2 次元配列を宣言すると、次のようになります。
int[][] numbers = new int[5][];
5つのint []のそれぞれを個別に宣言/初期化する必要があると思いましたか? たとえば、numbers[0][1] に値を代入する前に、次のように言わなければなりません。
numbers[0] = new int[4];
小さなプログラムを作成し、numbers[0][1] に明示的に値を入れて実行したところ、最初に numbers[0] を初期化せずに機能しました。個々の配列を 2 次元配列で最初に初期化する必要があると完全に考えていませんか?
編集:私の誤解は初期化にありました。最初の 2 つのステートメントは問題ありません。なぜなら、goodArray の各 int[] の長さを 3 に宣言したため、すべてが初期化されるからです。一方、badArray 宣言では、配列の数 (3) のみを宣言したので、npe を取得します。
int [][]goodArray = new int[3][3];
goodArray[0][1] = 2;
int[][] badArray = new int[3][];
badArray[0][0] = 2;