DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

5章8

このJavaのコードは2次元配列の各要素(ここでは文字列配列)の長さを合計して出力しています。ただし、コードの解説と答えEに至る理由を以下に説明します。

1.  public class Main {
2.    public static void main(String[] args) {
3.      // 2次元のString配列を定義する。3つの要素があり、
3.      // 1つ目は{"A", "B"}、2つ目はnull、3つ目は{"C", "D", "E"}です。
4.      String[][] array = { { "A", "B" }, null, { "C", "D", "E" } };
5.      // totalの変数を0で初期化する。
6.      int total = 0;
7.      // arrayの各要素(String配列)に対してループを実行する。
8.      for (String[] tmp : array) {
9.          // ここでtmpがnullの場合、tmp.lengthはNullPointerExceptionを引き起こす。
10.         total += tmp.length;
11.     }
12.     // totalを出力する。ただし、上記のエラーが発生するため、
13.     // 実際にはこの行に到達する前にプログラムはクラッシュする。
14.     System.out.println(total);
15. }
16. }

Enter fullscreen mode Exit fullscreen mode

解説:

  1. 行目: 2次元配列arrayを宣言しています。この配列には3つの要素があります。最初の要素は2つの文字列"A"と"B"を持つ配列、2番目の要素はnull(何も参照していない)、3番目の要素は3つの文字列"C"、"D"、"E"を持つ配列です。

  2. 行目: total変数を宣言し、0で初期化しています。この変数は配列の各要素の長さの合計を保持するために使います。

5-7. 行目: 拡張forループを使用して、2次元配列arrayの各要素に対してループを実行します。tmpは配列arrayの各要素、つまりString型の配列を参照します。

  1. 行目: totaltmp配列の長さを加算します。ここで注意が必要なのは、もしtmpnullを参照している場合、tmp.lengthはNullPointerExceptionを引き起こすということです。

  2. 行目: ループが終了した後、合計した長さtotalが出力されます。

このコードの場合、NullPointerExceptionが発生します。なぜなら、配列arrayの2番目の要素がnullであり、それにアクセスして.lengthを呼び出すときに例外がスローされるからです。このため、正しい答えはE「実行時に例外がスローされる」です。このコードはtmpnullでないことを確認せずに.lengthを呼び出しているため、2番目の要素でエラーが発生します。

もしコードが正常に実行されるように修正したければ、nullチェックを追加する必要があります。例えば:

5.      for (String[] tmp : array) {
6.          if (tmp != null) {
7.              total += tmp.length;
8.          }
9.      }
Enter fullscreen mode Exit fullscreen mode

この修正により、nullの要素を無視して他の要素の長さを合計することができ、NullPointerExceptionを避けられます。修正後のコードでは、"A"と"B"が2つ、"C"、"D"、"E"が3つ、合わせて5つの要素があるので、出力は5になります。しかし、元の質問のコードではこのようなチェックがないため、答えはEです。

Top comments (0)