DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on • Updated on

12章80

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)でループするため、nullが出力される
            for (int b = 0; b < array.length; b++) { // この行は、array[a].lengthにすれば、null出力はなく、数値で出力されるBの答となる
                // 配列の要素に文字コード'i'を文字列に変換して格納
                array[a][b] = "" + i;
                // 'i'をインクリメントして文字コードを次に進める
                i++;
            }
        }

        // 配列の全ての行について
        for (String[] tmp : array) {
            // 各行の全ての列について
            for (String s : tmp) {
                // 配列の値を出力、未初期化の場合はnullが出力される
                System.out.print(s + " ");
            }
            // 一行出力するごとに改行
            System.out.println();
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

このコードの問題点は、8行目でarrayの二次元目の長さではなく、一次元目の長さをループの上限としていることです。array[a].lengthを使用するべき場面でarray.lengthが使用されています。このため、arrayの第二行目にある配列は、初期化されていない残りの要素に対してnullが出力されます。これは、String型の配列がデフォルトでnull値で初期化されるためです。

このコードを実行すると、以下の出力が得られます(選択肢Aに一致)。

97 98
99 100 null null null
Enter fullscreen mode Exit fullscreen mode

追記

array[a] で値が null でなく実際の値が代入されるのは、Javaにおける配列の動作と初期化の方法に基づいています。具体的に説明します。

配列の初期化と代入

Javaでは、配列を宣言した際に、それがプリミティブ型の配列であれば各要素には型のデフォルト値が自動的に設定されます(例:int 型の場合は 0)。一方で、オブジェクト型の配列(例:String 型)の場合、各要素は自動的に null で初期化されます。

例えば、以下のように配列を宣言しました:

String[][] array = new String[2][];
array[0] = new String[2];  // この時点で array[0][0] と array[0][1] は `null`
array[1] = new String[5];  // この時点で array[1][0] から array[1][4] までが `null`
Enter fullscreen mode Exit fullscreen mode

値の代入

array[a] の各要素に値を代入するには、内部のループを使用して値を設定します。たとえば:

for (int a = 0; a < array.length; a++) {
    for (int b = 0; b < array[a].length; b++) {
        array[a][b] = "Value";  // 文字列 "Value" を各要素に代入
    }
}
Enter fullscreen mode Exit fullscreen mode

このループ構造では、array[a] が指す各行に対して、その行の長さ(array[a].length)だけループを実行し、各要素(array[a][b])に値を代入しています。array[a].length はその行の要素数を表しており、この方法によって、行の全ての要素に確実に値が代入され、初期値の null が上書きされます。

null が出力されない理由

このようにして各要素に値が代入されるため、配列の要素を出力する際には null ではなく、代入された値が表示されます。配列の各行について array[a].length の数だけ正確に値を代入することで、配列の全要素が適切に初期化されます。このプロセスにより、各行のすべての要素に具体的な値が存在し、その結果として出力時に null が見られなくなるのです。

Top comments (0)