この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);
}
}
このコードでは、str
がnull
であるために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
}
}
この場合、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
}
}
この場合、str
がnull
の場合は"default"
で初期化され、その後switch
文が実行されます。default
ブロックが実行され、"def"
がstr
に連結されるため、出力は"defaultdef"
になります。
これらの修正により、NullPointerException
を回避し、プログラムが期待通りに実行されます。
Top comments (0)