DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

12章74

このJavaのプログラムは、以下のことを試みています。しかし、コードにはいくつかの問題があり、期待される動作は実現できません。

  1. String[] str配列をサイズ2で初期化します。
  2. 各要素に対して、"e" + インデックス番号の文字列を結合しようとしていますが、これが正しく動作しません。

以下に、コードの各部分にコメントを付けて説明します。

public class Main {
    public static void main(String[] args) {
        // 文字列の配列をサイズ2で初期化
               //下記の2つのインスタンスがつくられる。
        // str[0] -> null
        // str[1] -> null
        String[] str = new String[2];
        int i = 0;

        // 配列の各要素に "e" + インデックス番号を結合するループ
        for (String s : str) {
            // str[i]に "e" + i を結合(実際にはこの操作は何も行わない)
            str[i].concat("e" + i);
            i++;
        }

        // 配列の各要素を出力するループ
        for (i = 0; i < str.length; i++) {
            System.out.println(str[i]); // すべての要素はnullのまま
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

問題点

  1. str[i].concat("e" + i);は文字列を結合しますが、str[i]自体は変更されません。文字列はイミュータブル(不変)なので、concatメソッドは新しい文字列を返しますが、元のstr[i]を変更するわけではありません。
  2. String[] strは初期化時点では各要素がnullなので、str[i].concat("e" + i);を呼び出すとNullPointerExceptionが発生します。

修正方法

以下のように修正すると、正しく動作します。

public class Main {
    public static void main(String[] args) {
        // 文字列の配列をサイズ2で初期化

        String[] str = new String[2];
        int i = 0;

        // 配列の各要素に "e" + インデックス番号を代入
        for (int j = 0; j < str.length; j++) {
            str[j] = "e" + j;
        }

        // 配列の各要素を出力するループ
        for (i = 0; i < str.length; i++) {
            System.out.println(str[i]); // 正しく "e0" と "e1" が出力される
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

この修正により、配列の各要素に"e"とインデックス番号を結合した文字列が代入され、期待通りの出力が得られます。

Top comments (0)