12章13

RMAG news

この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を回避し、プログラムが期待通りに実行されます。

Leave a Reply

Your email address will not be published. Required fields are marked *