switch文

<概要>多方向分岐を学びます。C言語、C++言語と一緒(笑)!

例題5-1 三つの選択肢「1 , 2 , 3」の中から一つをキー入力により選んでもらうプログラム。

○答え

import java.io.*;

public class Drink1{
  public static void main(String[] args){
    BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
    try{
      System.out.println("飲み物は何が好きですか?");
      System.out.println("1 オレンジジュース");
      System.out.println("2 コーヒー");
      System.out.println("3 どちらでもない");
      System.out.println("1,2,3のどれかを選んで下さい。");
      String line=reader.readLine();
      int n=Integer.parseInt(line);
      switch(n){
        case 1:
          System.out.println("オレンジジュースです。");
          break;
        case 2:
          System.out.println("コーヒーです。");
          break;
        default:
          System.out.println("どちらでもありません。");
          break;
      }
    }catch(IOException e){
      System.out.println(e);
    }catch(NumberFormatException e){
      System.out.println("数字の形式が正しくありません。");
    }
  }
}


○実行結果

D:\atsushi\Java\List5-1>java Drink1
飲み物は何が好きですか?
1 オレンジジュース
2 コーヒー
3 どちらでもない
1,2,3のどれかを選んで下さい。
1
オレンジジュースです。
-- Press any key to exit (Input "c" to continue) --
-- Input "exit" to exit from CommandPrompt --

D:\atsushi\Java\List5-1>java Drink1
飲み物は何が好きですか?
1 オレンジジュース
2 コーヒー
3 どちらでもない
1,2,3のどれかを選んで下さい。
123
どちらでもありません。

D:\atsushi\Java\List5-1>java Drink1
飲み物は何が好きですか?
1 オレンジジュース
2 コーヒー
3 どちらでもない
1,2,3のどれかを選んで下さい。
a
数字の形式が正しくありません。

D:\atsushi\Java\List5-1>

○解説

switch の後に書けるのは整数式
case の後に書けるのは整数の定数式だけ。
ただし、long 型は(整数ですが)使えません。
double 型や String 型は整数ではありませんので、使えません。
C言語、C++言語と一緒ですね。

○補足

コンパイラは、switch の後、case の後にint 型を期待しています。

例題5-2 三つの選択肢「a , b , c」の中から一つをキー入力により選んでもらうプログラム。

○答え

import java.io.*;

public class Drink2{
  public static void main(String[] args){
    BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
    try{
      System.out.println("飲み物は何が好きですか?");
      System.out.println("a オレンジジュース");
      System.out.println("b コーヒー");
      System.out.println("c どちらでもない");
      System.out.println("a,b,cのどれかを選んで下さい。");
      String line=reader.readLine();
      char c=line.charAt(0);
      switch(c){
        case 'a':
          System.out.println("オレンジジュースです。");
          break;
        case 'b':
          System.out.println("コーヒーです。");
          break;
        default:
          System.out.println("どちらでもありません。");
          break;
      }
    }catch(IOException e){
      System.out.println(e);
    }
  }
}


○実行結果

D:\atsushi\Java\List5-2>java Drink2
飲み物は何が好きですか?
a オレンジジュース
b コーヒー
c どちらでもない
a,b,cのどれかを選んで下さい。
b
コーヒーです。
-- Press any key to exit (Input "c" to continue) --
-- Input "exit" to exit from CommandPrompt --

D:\atsushi\Java\List5-2>java Drink2
飲み物は何が好きですか?
a オレンジジュース
b コーヒー
c どちらでもない
a,b,cのどれかを選んで下さい。
2
どちらでもありません。

D:\atsushi\Java\List5-2>java Drink2
飲み物は何が好きですか?
a オレンジジュース
b コーヒー
c どちらでもない
a,b,cのどれかを選んで下さい。
A
どちらでもありません。

D:\atsushi\Java\List5-2>

○解説

line.charAt(位置) メソッドは文字列 line の中の「位置」にある文字を取得します(最初の位置は 0 )。

char 型の定数は一重引用符でくくられた文字になります。
もし case a: と書いたなら

■D:\atsushi\Java\List5-2> javac Drink2.java
Drink2.java:15: シンボルを解決できません。
シンボル: 変数 a
場所 : Drink2 の クラス
case a:
    ^
エラー 1 個

このように変数と見なされてしまいます。

また、'a' と 'A' の値が違うのは言うまでもないでしょう。

○補足

'あ' 、 'い' 、 'う' なども char 型の定数です。
つまり、Unicode で扱える文字を一重引用符でくくったものは全て char 型の定数になります。

例題5-3 三つの選択肢「1 or a , 2 or b , 3 or c」の中から一つをキー入力により選んでもらうプログラム。

○プログラム

import java.io.*;

public class Drink3{
  public static void main(String[] args){
    BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
    try{
      System.out.println("飲み物は何が好きですか?");
      System.out.println("1 オレンジジュース(a)");
      System.out.println("2 コーヒー(b)");
      System.out.println("3 どちらでもない(c)");
      System.out.println("1,2,3のどれかを選んで下さい(a,b,cでも選べます)。");
      String line=reader.readLine();
      char c=line.charAt(0);
      switch(c){
        case '1':
        case 'a':
          System.out.println("オレンジジュースです。");
          break;
        case '2':
        case 'b':
          System.out.println("コーヒーです。");
          break;
        default:
          System.out.println("どちらでもありません。");
          break;
      }
    }catch(IOException e){
      System.out.println(e);
    }
  }
}


○実行結果

D:\atsushi\Java\List5-3>java Drink3
飲み物は何が好きですか?
1 オレンジジュース(a)
2 コーヒー(b)
3 どちらでもない(c)
1,2,3のどれかを選んで下さい(a,b,cでも選べます)。
1
オレンジジュースです。
-- Press any key to exit (Input "c" to continue) --
-- Input "exit" to exit from CommandPrompt --

D:\atsushi\Java\List5-3>java Drink3
飲み物は何が好きですか?
1 オレンジジュース(a)
2 コーヒー(b)
3 どちらでもない(c)
1,2,3のどれかを選んで下さい(a,b,cでも選べます)。
a
オレンジジュースです。

D:\atsushi\Java\List5-3>

○解説

switch 文の条件式となっているのは char 型の変数です。
つまり、Unicode 値(整数)で評価していることになります。
1 という Unicode 値をもつ文字はあるかも知れません。
しかし、それは 1 という文字ではないでしょう。
1 という文字を示す Unicode 値は '1' で取得できます。
あうーややこしい表現だー(笑)。

例題5-4 問題5-2で一文字も入力せずにリターンキーを押したらどうなるでしょう?

○答え

D:\atsushi\Java\List5-2>java Drink2
飲み物は何が好きですか?
a オレンジジュース
b コーヒー
c どちらでもない
a,b,cのどれかを選んで下さい。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:444)
at Drink2.main(Drink2.java:13)
-- Press any key to exit (Input "c" to continue) --

○解説

これは、charAt メソッドが最初の文字を取得しようとしたら、
最初の文字が無かった為に起こった例外( Exception )です。
「String index out of range: 0」は「0番目は文字列が存在する範囲を超えています」といったような意味です。

○解決策

char c=line.charAt(0);

を修正して、

char c;
if(line.length()>0){
  c=line.charAt(0);
}else{
  c='z';
}


とするか、

char c;
if(line.equals("")){
  c='z';
}else{
  c=line.charAt(0);
}


のようにして、空文字列だった場合は「c どちらでもない」が選択されたと見なせばよいでしょう。
length メソッドは文字列の長さを返します。
equal メソッドは引数に渡した文字列と自身が保存している文字列が
等しければ true を、等しくなければ false を返します。


戻る / ホーム