DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

12章13

このJavaコードは、switchステートメントを使って文字列strの値に基づいて異なる操作をすることを意図しています。しかし、strが初期化されていないため、その値はnullです。switchステートメントはnull値を扱うことができないため、実行時にNullPointerExceptionが発生します。それを踏まえて、コードにコメントを追加して説明します。コメントを追加するには、行に対して直接説明を書きます。以下がその例です:

public class Sample {
  // strはクラスレベルの変数で初期値はnull
  static String str;

  public static void main(String[] args) {
    // switch文にはstrが渡されるが、strはnullなのでNullPointerExceptionが投げられる
    switch(str) {
      // このcaseはstrが"10"の時にマッチするが、到達されない
      case "10" : str += "10"; break;
      // defaultケース: strがnullでも他の値でもマッチするが、nullの場合は例外が発生する
      default : str += "def"; break;
      // このcaseはstrが"20"の時にマッチするが、到達されない
      case "20" : str += "20"; break;
    }
    // この出力文もNullPointerExceptionのために到達されない
    System.out.println(str);
  }
}
Enter fullscreen mode Exit fullscreen mode

このコードでは、strnullであるためにswitch文に入るとNullPointerExceptionが発生し、プログラムはクラッシュします。その結果、System.out.println(str);の行は実行されず、何も出力されません。答えがD、「実行時に例外がスローされる」というのはこのためです。

追記

例外を回避するには、switch文に渡されるstrの値をnullでないものに初期化するか、switch文の前でstrの値をチェックして処理を行う必要があります。strを適切な値で初期化することは、最も単純な修正の一つです。

例えば、strを空文字列で初期化する方法です:

public class Sample {
  static String str = "";

  public static void main(String[] args) {
    switch(str) {
      case "10" : str += "10"; break;
      default : str += "def"; break;
      case "20" : str += "20"; break;
    }
    System.out.println(str);  // 出力: def
  }
}
Enter fullscreen mode Exit fullscreen mode

この場合、strは空文字列で初期化されるため、defaultブロックが実行され、"def"strに連結されます。その結果、System.out.println(str);"def"を出力します。

nullの場合に特別な処理を行いたい場合は、switch文に入る前にnullチェックを行うこともできます:

public class Sample {
  static String str;

  public static void main(String[] args) {
    if (str == null) {
      str = "default";
    }
    switch(str) {
      case "10" : str += "10"; break;
      default : str += "def"; break;
      case "20" : str += "20"; break;
    }
    System.out.println(str);  // 出力: defaultdef
  }
}
Enter fullscreen mode Exit fullscreen mode

この場合、strnullの場合は"default"で初期化され、その後switch文が実行されます。defaultブロックが実行され、"def"strに連結されるため、出力は"defaultdef"になります。

これらの修正により、NullPointerExceptionを回避し、プログラムが期待通りに実行されます。

Top comments (0)