了解しました。こちらがコメントアウトを加えたコードです。説明を行いながら各部を注釈付けします。
public class Test {
public static void main(String[] args) {
// 2次元([2]が2行で[]は要素(列))のString配列を宣言
String[][] array = new String[2][];
// 最初の行に2つの要素を持つString配列を初期化
array[0] = new String[2];
// 2番目の行に5つの要素を持つString配列を初期化
array[1] = new String[5];
// 'i'をASCIIコードの'a'に相当する97で初期化
int i = 97;
// 外側のループはarrayの行をイテレート
for (int a = 0; a < array.length; a++) {
// 内側のループは各行の長さをチェックするべきだが、ここでは間違ってarrayの行数(2)でループ
for (int b = 0; b < array.length; b++) { // この行は誤りで、array[a].lengthにすべき
// 配列の要素に文字コード'i'を文字列に変換して格納
array[a][b] = "" + i;
// 'i'をインクリメントして文字コードを次に進める
i++;
}
}
// 配列の全ての行について
for (String[] tmp : array) {
// 各行の全ての列について
for (String s : tmp) {
// 配列の値を出力、未初期化の場合はnullが出力される
System.out.print(s + " ");
}
// 一行出力するごとに改行
System.out.println();
}
}
}
このコードの問題点は、8行目でarrayの二次元目の長さではなく、一次元目の長さをループの上限としていることです。array[a].length
を使用するべき場面でarray.length
が使用されています。このため、arrayの第二行目にある配列は、初期化されていない残りの要素に対してnull
が出力されます。これは、String
型の配列がデフォルトでnull
値で初期化されるためです。
もしコードを修正すれば、2行目の配列のすべての要素に値が割り当てられるため、null
は出力されません。ただし、この誤りのあるコードを実行すると、以下の出力が得られます(選択肢Bに一致)。
97 98
99 100 null null null
Top comments (0)