switch文の中で宣言した変数のスコープ - 萌えJava超入門
第十三章 変数とスコープ

switch文の中で宣言した
変数のスコープ

switch文の中では変数を宣言しないに越したことはありません。

目次


1.switch文の中で宣言した変数のスコープ

switch文の中で宣言した変数のスコープはちょっとめんどいです。
switch文の中で変数を宣言しないに越したことはありません。

でも、興味本位で掘り下げてみましょう。
普通に使うとこんな感じ。
//Sample08_032.java
class Sample08_032{

  static String method_sw(int i){
      String str1;
      switch(i){
      case 0:
int x = 666; str1 = x + "!";
break; case 1:
int y = 777; str1 = y + "!";
break; case 2:
int z = 888; str1 = z + "!";
break; default: str1 = "default!"; }//スコープはここまで。 return str1; } public static void main(String[] args){ String str = method_sw(1); System.out.println(str); } }

コマンドライン
>javac Sample08_032.java
>java Sample08_032
777!
まあ予想通りよね。


変なことするとこんな感じ。
//Sample08_033.java
class Sample08_033{
  static String method_sw(int i){
      String str1;
      switch(i){
case 0: int x = 666; str1 = x + "!"; break; case 1: x = 777; str1 = x + "!"; break; case 2:. x = 888; str1 = x + "!"; break; default: x = 999; str1 = "default!" + x;
}//スコープはここまで。 return str1; } public static void main(String[] args){ String str = method_sw(3); System.out.println(str); } }

コマンドライン
>javac Sample08_033.java
>java Sample08_033
default!999

あれ?
x を宣言しているのは
case 0: だけですよね。
break以降も x のスコープ内ってこと?



ほら、
}」 までがスコープだから。


2.初期化されていない可能性


さらに変なことするとこんな感じ。
//Sample08_033NG.java
class Sample08_033NG{
  static String method_sw(int i){
      String str1;
      switch(i){
case 0: int x = 666; str1 = x + "!"; break; case 1: //初期化してない str1 = x + "!"; break; case 2: //初期化してない str1 = x + "!"; break; default: //初期化してない str1 = "default!" + x;
}//スコープはここまで。 return str1; } public static void main(String[] args){ String str = method_sw(2); System.out.println(str); } }

コマンドライン
>javac Sample08_033NG.java
Sample08_033NG.java:11:
 エラー: 変数xは初期化されていない可能性があります
            str1 = x + "!";
                   ^
Sample08_033NG.java:14:
 エラー: 変数xは初期化されていない可能性があります
            str1 = x + "!";
                   ^
Sample08_033NG.java:17:
 エラー: 変数xは初期化されていない可能性があります
            str1 = "default!" + x;
                                ^
エラー3個

case 0 で宣言された変数 x のスコープは「}」までですが、
case 0:を通らなかった場合には、変数 x の初期化が行われていないことになるようです。
コンパイルエラーになってしまいました。

読む方も読みにくいですね。
スコープは狭いに越したことはありませんが、
可読性が気になるので switch文の前にローカル変数 xを宣言しましょう。

というわけで、
私はswitch文の中では変数を宣言したくない。
ですね。



私も switch文の中では変数を宣言したくないです。

お疲れ様でした。




© 2019 awasekagami