こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

switch で疑問。java超初心者です。

まず、

public class P1{
  public static void main(String[] args){
    int n = 1;

      switch(n){
        case 0:
          System.out.println("あ");
          break;
        case 1:
          System.out.println("い");
          break;
        case 2:
          System.out.println("う");
          break;
        default:
          System.out.println("え");
      }
  }
}
は、当然「い」と表示されますよね。
default: をcase 3:にしても、問題なく「い」と表示されました。

そこで、こんな風にしてみました。

public class P3{
  public static void main(String[] args){
    int n = 1;
    String s;

      switch(n){
        case 0:
          s="あ";
          break;
        case 1:
          s="い";
          break;
        case 2:
          s="う";
          break;
        default:
          s="え";
      }
      System.out.println(s);
  }
}
これは「い」と表示されましたが、
default: をcase 3:にすると、エラーとなってしまいます。なぜでしょう。

ちなみに、エラーの内容は

変数 s は初期化されていない可能性があります。
    System.out.print(s);
               ^
というものでした。
そこで、
変数 s を初期化してみようと、次のように変数 s の宣言の後に null を代入しました。

String s=null;

すると、「い」と表示され、エラーは出ません。

なぜ、このようになるのでしょうか。
String型の変数を使っていて、今まではこのようなエラーは出た事が無かったのですが、
どうやらswitch文の中では、初期化しろ、と出てくるようです。

わかり易い解説をいただければと思います。

これは仕様だということで、この通り受け入れるしかないのでしょうか。
勉強していて、少々腑に落ちないので、質問致しました。
よろしくお願いいたします。

投稿日時 - 2012-05-03 15:45:12

QNo.7455202

困ってます

質問者が選んだベストアンサー

>変数 s は初期化されていない可能性があります。

変数を使う前(System.out.print(s); より前)には、必ず代入する必要があります。

sへの代入は、switchの中の各caseの部分にしか無いですが、switchにdefaultが無いとどのcaseも実行されないかも知れない(例えばnが10のケース)ので、「初期化されていない可能性があります」ということです。

投稿日時 - 2012-05-03 16:13:36

お礼

早速のご回答、ありがとうございました。
まだまだJavaに携わったばかりで、こんな質問をしてしまい、失礼しました。
回答を見て、
あー、なるほど。。。
という感じでした。
勉強不足を痛感致しました。
ありがとうございました。

投稿日時 - 2012-05-03 20:24:14

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

defaultが無くなったから。

nが0,1,2,3以外の場合に初期化されていない状態でsが参照される可能性がある。

String s ;
System.out.print(s);
と、やってしまったのと同じ状態が起きうると言う警告ですのでswitchがうんたらとは関係ありません。

投稿日時 - 2012-05-03 17:38:33

お礼

わかりやすい説明、ありがとうございました。

投稿日時 - 2012-05-03 20:26:00

ANo.2

>String型の変数を使っていて、今まではこのようなエラーは出た事が無かったのですが、
>どうやらswitch文の中では、初期化しろ、と出てくるようです。

別段switch文の中だからとかではなく、変数sが初期化なく(何も値が設定されずに)参照される可能性があるのでエラーとなっているだけです(エラーメッセージの通り)。

投稿日時 - 2012-05-03 17:10:15

お礼

コトは単純な話だあったんですね。
ありがとうございました。

投稿日時 - 2012-05-03 20:25:18