戻る

条件分岐:i f文

   これまで出てきたプログラムでは、文は全て置かれた順に実行された。

   文1
   文2
   文3

   例えばこのようなプログラムでは、「文1→文2→文3」の順に実行された。
  これからもう少し複雑な動きを持った制御文を取り上げる。制御文は、文が置かれた順番に実行されるとは限らない。
   制御文として最初に取り上げるのがif文である。if文を使うと、条件によりある文を実行したりしなかったり出来る。
  そこで、if文の事を条件文とか選択文といったりする。
   if文には、2つの形がある。最も簡単なのは、次の形式である。

   if (条件式)文;

   このままだと少々見づらいので2行に分けて書くことにする。

   if (条件式)
     文; ・・・・・2文字下げて書く

   ( ) の中には、結果がtrueまたはfalseになる式―すなわちboolean型の式を書く。
  その条件式がtrueなら続く文が実行される。しかし、falseの場合は続く文が実行されない。

   if (true)
     文; ・・・・・この文は実行される。

   if (false)
     文; ・・・・・この文は実行されない。

等値演算

   if文の( )の中で使う条件式として、次の等値演算が良く使われる。
  等値演算というのは、2つの値が等しいかどうかを調べる演算で、javaでは次の演算子を使って行う。

演算子 演算結果
x == y  xとyが等しければtrue。そうでなければfalse
x != y   xとyが等しくなければtrue。そうでなければfalse 

   数学では、=が等値を表すが、javaではすでに=を代入演算に使用している。そこで、代わりに==を等値演算に使用する。次に例を示す。

   if (num == 100) ・・・・・変数numの値が100に等しければtrue
   if (num != 100)  ・・・・・変数numの値が100に等しくなければtrue

   次のサンプルは、簡単な「数当てゲーム」を行うものである。
  コマンドライン引数で指定されたある数(実際は7)なら正解、そうでなければ不正解というゲームである。
  以下は、それを==演算子を用いて書いたものである。

   サンプル:Hit.java

   //
   // Hit.java---数当てゲーム
   //
   public class Hit {
    public statifc void main(String[ ] args) {
     if (Integer.perseInt(args[0] == 7)
       System.out.println("おめでとう。正解です!");
    }
   }

   次の実行例では3を入力している。3は正解ではないので、何も表示されない。

   $ java Hit 3
   $ _      ・・・・・何も表示されない

   以下は、正解の7を入力した場合の実行例。

   $ java Hit 7
   おめでとう。正解です!
   $ _

   次は、前項のサンプルを !=演算子を使って書き換えたものである。
  !=演算子の場合、等しくない場合に続く文が執行されるので、今度のプログラムでは不正解の場合にメッセージが表示される。

   サンプル;Hit_2.java

   //
   // Hit_2.java---数当てゲーム(!=版)
   //
   public class Hit_2 {
    public class void main(String[ ] args) {
     if (Integer.perseInt(args[0] != 7)
       System.out.println("残念、不正解です!");
    }
   }

   実行例

   $ java Hit_2 3
   残念、不正解です! ・・・・・不正解の場合
   $ java Hit_2 7
   $ _            ・・・・・正解の場合は何も表示されない。

else節

   前節で紹介した「数当てゲーム」は、「==演算子版」で成功のメッセージ、「!=演算子版」で不成功のメッセージを表示した。
  しかし、できれば成功・不成功のいずれの場合もメッセージを表示したい。
  その為には、if文の2つ目の形式―すなわち次の形を使うと可能になる。

   if (条件式)
     文1 ・・・・・条件式がtrueならこの文が実行される。
   else
     文2 ・・・・・条件式がfalseならこの文が実行される。

   この新しい書き方では、オプションのelse節が追加になっている。
  ( )の中の条件式がtrueならば、文1が実行される。また、falseの場合は、文2が実行される。
   次のサンプルは、この新しいif文を使って「数当てゲーム」を改良し、
  成功・不成功のいずれの場合もメッセージを表示するようにしたものである。

   サンプル;Else.java

   //
   //Else.java---数当てゲーム(else節付き)
   //
   public class Else {
    public static void main(String[ ] args) {
     if (Integer.perseInt(args[0] == 7)
       System.out.println("おめでとう。正解です!");
     else
       System.out.println("残念、不正解です!");
    }
   }

   実行例

   $ java Else 94
   残念、不正解です!
   $ java Else 7
   おめでとう。正解です!
   $ _

コマンドライン引数の検査

   これまでいくつかコマンドライン引数を使ったサンプルを書いてきた。
  それらのプログラムは、いずれも大きな欠陥をかかえている。それは、必要な引数を指定しないと、実行時エラーになってしまうことである。
  例えば、前節のサンプルElseを引数を指定せずに実行すると、次のようなエラーになる。

   $ java Else
   Exception in thred "main" java.lang.ArrayIndexOutBoundsException at Else.main(Else.java:6)

   このような、コマンドライン引数を使ったプログラムで、ユーザーが引数を指定しないでも適切なエラー処理を行えるようにする方法を考える。

コマンドライン引数の数

   コマンドライン引数について適切な処理をするには、いくつの引数が指定されたかをプログラムの中で把握する必要がある。
  これは、「配列の要素数」のところで説明したlengthを参照するとわかる。lengthは、配列の要素の数を取得するのに使われる。
   コマンドライン引数は、配列として与えられる。

   String[ ] args  ←この配列を使ってコマンドライン引数を参照する。

   したがって、次のようにすれば、コマンドライン引数で指定された引数の数を知る事が出来る。

   args.length

   この事を次のサンプルで確かめる。このプログラムでは、コマンドラインで指定された引数の数を表示するものである。

   サンプル:Args.java

   //
   //Args.java---コマンドライン引数の数を表示する
   //
   public class Args {
    public static void main)String[ ] args) {
     System.out.println("コマンドライン引数の数="+args.length);
    }
   }

   実行例

   $ java Args ・・・・・・・・・・引数をしてしない
   コマンドライン引数の数= 0
   $ java Args one two ・・・引数を2個指定
   コマンドライン引数の数= 2
   $ java Args 1 2 3 4 ・・・・引数を4個指定
   コマンドライン引数の数= 4
   $ _

比較演算

   コマンドライン引数で指定された引数の数がわかると、プログラムで必要な数の引数が指定されなかった場合の処理を書くことができる。
  例えば、2個の引数が必要なプログラムでは、次のようなif文をつくればよい。

   if (args.length<2)
     ・・・・・・・・・・・・・・・引数が足りない場合の処理をここに書く。

   ところで、このif文の条件式に使った<は比較演算子の1つである。
  比較演算は、2つの値の大小を比較してその結果trueまたはfalseの値を算出する演算である。
  "x < y"は、xがy未満ならば、true、そうでなければfalseとなる。
  比較演算子には、次のものがある。

演算子 演算結果
x < y xがy未満ならtrue。そうでなければfalse。
x <= y xがy以下ならばtrue。そうでなければfalse。
x < y xがyより大きければtrue。そうでなければfalse。
x <= y xがy以上ならばtrue。そうでなければfalse。

exit

   引数の数が足りない場合、どのような処理を書いたら良いだろう。
  一つは、適切なメッセージの出力である。通常は、正しいコマンドの書式を表示する。
  例えば、「数当てゲーム」の場合は、引数に数字を1つ入力してもらうので、次のようなメッセージを出力する。

   使い方:コマンド名数字

   これを出力するprintlnは、次のようになる。

   Systemout.println("使い方:コマンド名数字");

   それともう1つ、プログラムの強制終了である。javaでプログラムを強制終了させるには、exitを次のように使う。

   System.exit(終了コード);

   終了コードというのはUNIXの概念で、親プロセス(コマンドの場合、通常はシェル)にそのプログラムの終了状態を伝えるのに使う。
  終了コードとしては、慣例として次の値を使用する。

   0 ・・・・・・・・・・・正常終了
   1以上の数字 ・・何らかの異常があって終了

   引数が足りなくてプログラムを強制終了する場合は、終了コードとして1を指定すればよい。(1以上の値でもよい。)

   System.exit(1);

   なお、javaではexitを経由しないで終了すると、終了コードとして0が親プロセスに渡される。
  しかし、その場合でも次のように明示的にexitを使ってもよい。

if文の限界

   引数の数が足りない場合に必要な処理が出揃った。次の2つの文を実行すればよい。

   System.out.println("使い方:・・・・・"); ・・・書式を出力して
   System.exit(1); ・・・・・・・・・・・・・・・・・・・・強制終了する

   この2つの文をif文の中に組み込む。

   if (args.length < 1) ・・・・・引数が1より少なければ
     System.out.println("使い方:コマンド名数字")
     System.exit(1);

   ところが、ここで1つの問題が発生する。if文は、条件を満たした場合に、1つの文しか実行出来ない。

   if(条件式)
     文; ・・・・・ここに文は1つしか置けない。

   しかし、ここでは2つの文を実行させたい。このような時に活躍するのが、次に説明するブロックである。

ブロック

   if文に複数の文を置くには、ブロックを使えば解決する。ブロックというのは、次のような形をしている。

   { }

   要するに1組の中括弧である。これだけでは、何の役にも立たないが、ブロックの中には複数の文を置く事が出来る。

   {
    文1
    文2
    文3
    ……
   }

   ブロックの中に置かれた文は、先頭から順に実行される。
  ブロックが重要なのは、ブロック全体で1つの文として扱われる事である。
  ブロックを使えば1つの文しか置けない所に複数の文を置く事が出来る。

   「数当てゲーム」を改良し、次のようにコマンドライン引数の検査を組み込む。

   if (args.length < 1) {
     System.out.println("使い方:コマンド名数字");
     System.exit(1);
   }

   サンプル:Exit_1.java

   //
   //Exit_1.java---数当てゲーム(Exit付き)
   //
   public class Exit_1 {
    pubkic static void main(String[ ] args) {
     if (args.length < 1) {
       System.out.println("使い方:コマンド名数字");
       System.out.exit(1);
     }

     if (Integer.parseInt(args[0]) == 7)
       System.out.println("おめでとう。正解です!");
     else
       System.out.println("残念、不正解です!");

     System.exit(0);
    }
   }

   実行例、尚Windowsには終了コードを調べる内部コマンドは無い。

   $ java Exit_1 ・・・・・・・・・・・・引数を指定しない
   使い方:コマンド名数字 ・・・・書式が表示される
   $ echo $? ・・・・・・・・・・・・・・プログラムの終了コードを調べる
   1 ・・・・・・・・・・・・・・・・・・・・・これは、exitで終了した値
   $ java Exit_1 300
   残念、不正解です!
   $ echo $?
   0 ・・・・・・・・・・・・・・・・・・・・・正常終了の場合のコード
   $ _

   3〜8行目はLinuxのみ

3つ以上の条件分岐

   if文では2通りの場合分けが出来る。しかし、時には3つ以上の場合分けが必要になることがある。

else if

   if文では、2通りの場合分けが出来る。

   if (条件式)
     文1 ・・・・・場合1
   ekse
     文2 ・・・・・場合2

   else節に置く「文2」は文なら何でも良い。そこで、文2に再びif文を使えば3通りの場合分けが可能になる。

   if (条件式)
     文1 ・・・・・場合1
   else if (条件式)
     文2 ・・・・・場合2
   else
     文3 ・・・・・場合3

   このようにelse節にif文を置く事により、何通りもの場合分けが可能になる。

   次のサンプルは、ある遊園地の入場料を表示するものである。この遊園地では、年齢により入園料が4段階に分かれている。

区分 年齢 料金
乳児 4歳以下 無料
園児 7歳以下 400円
小学生 12歳以下 600円
大人 13歳以上 1000円

   サンプル:If_nest.java
   //
   //If_nest.java---遊園地の入場料
   //
   public class If_nest {
    public static void main (String[ ] args) {
     if (args.length == 0) {
       System.out.println("使い方:コマンド名年齢";
       System.exit(1)
     }

     int age = Integer.parseInt(args[0]);

     if (age <= 4)
       System.out.println("入園料は無料です");
     else if (age <=7)
       System.out.println("入園料は400円です");
     else if (age <= 12)
       System.out.println("入園料は600円です");
     else
       System.out.println("入園料は1,000円です");

     System.exit(0);
    }
   }

   実行例

   $ java If_nest ・・・・・・・引数を指定しない
   使い方:コマンド名年齢
   $ java If_nest 4 ・・・・・4歳以下の入力例
   入園料は無料です
   $ java If_nest 7 ・・・・・7歳以下の入力例
   入園料は400円です
   $ java If_nest 12 ・・・・12歳以下の入力例
   入園料は600円です
   $ java If_nest 13 ・・・・13歳以下の入力例
   入園料は1,000円です
   $ _

次へ