Java 入門

ホーム > Java の基本 > 処理の分岐

処理の分岐

プログラムは基本的に、上から順番に実行していきます。 しかしながら、ある条件の時はここを実行、この時はここは実行しない、というように、 条件によって、実行する順番を制御することができます。

プログラムの実行順を制御するのは、 以下に説明する if 文、while 文等を用います。これらを制御文 (Control flow statements) といいます。

ここでは、Java で利用可能な制御文について説明します。

if 文

if 文では、条件が真 (true) と評価されるときに実行するコードブロック、偽 (false) のときに実行するコードブロックを指定することができます。

if( 条件文1 ) {
     // 条件文1 が真 (true) のときにここが実行される
}
else {
     // 条件文1 が偽 (false) のときにここが実行される
}

条件は複数あっても構いません。その場合は else if (条件文2) として記述します。 また、else ブロックは任意です。

実行例は次のとおりです。

public class ControlFlow1 {

     public static void main(String[] args) {

          int i = 68;
          
          if( 80 < i ) {
               System.out.println( "A" );
          } else if( 60 < i ) {
               System.out.println( "B" );
          } else {
               System.out.println( "C" );
          }
          
     }
     
}

実行結果は次のとおりです。

B

i は 68 にセットされており、i は 80 より小さいので最初の条件文 ( 80 < i ) は false です。 このため "A" を出力する行は実行されません。

次の条件文 ( 60 < i ) は true と評価されるので、 文字列 B を出力する行が実行されています。

switch 文

switch 文は指定した変数が特定の値をとる場合に、実行するコードを指定できます。 変数は switch で指定して、条件となる値は case に指定します。case 値: に続けて、 実行するコードを指定できます。コードブロックは break まで実行されます。

switch( 変数 ) {
case 値1:
case 値2:
     // 値1 か値 2 のときここが実行される
     break;
case 値3:
     // 値3 のときにここが実行される
     break;
default:
     // 値1, 2, 3 のいずれでもない時にここが実行される
     break;               
}          

実行例は次のとおりです。

public class ControlFlow2 {

     public static void main(String[] args) {

          int i = 4;

          switch( i ) {
          case 1:
               System.out.println("Sunday");
               break;
          case 2:
               System.out.println("Monday");
               break;
          case 3:
               System.out.println("Tuesday");
               break;
          case 4:
               System.out.println("Wednesday");
               break;
          case 5:
               System.out.println("Thursday");
               break;
          case 6:
               System.out.println("Friday");
               break;
          case 7:
               System.out.println("Saturday");
               break;
          default:
               System.out.println("Invalid data");
               break;               
          }          
     }

}

実行結果は次です。

Wednesday

i は 4 にセットされていたので、"Wednesday" という文字を出力するコードが実行されています。

尚、注意しないといけないのは、必要なコードブロックを実行したら忘れずに break するということです。 そうしないと、次々とプログラムが実行されてしまいます。これを switch 文のフォール・スルー (fall through) といいますが、 この手のバグは非常に発生しやすいので有名です。

フォール・スルーを利用してコードを書くこともできますが、その場合は、if 文で同様のコードが書けないか検討するのも良いでしょう。

while 文

while 文は条件が真である場合に、処理を繰り返すために利用できます。while 文は先に条件文を評価するパターンと、 条件文をコードを実行してから評価するパターン (do-while文) に分けられます。

while 文

while に条件文を指定し、その条件文が true と評価される限り、while に続くコードブロックが実行されます。 繰り返し処理になるので、while ループなどともいいます。

while ( 条件文 ) {
     // 条件文が真 (true) である限りここが繰り返し実行される
}

条件文が正しく設定されないと、延々とコード繰り返してしまい、いつまで経ってもプログラムが終了しないということになってしまいますので、 注意してください。

public class ControlFlow3 {

     public static void main(String[] args) {

          int i = 0;
          
          while ( i < 3 ) {
               System.out.println( i );
               i++;
          }

     }

}

実行例は次のとおりです。

0
1
2

はじめに i を 0 にセットします。 while の条件文では ( i < 3 ) を指定しているので、 条件文は true と評価されるので、{ と } で囲まれたコードブロックが実行されます。

この中では、i の値を出力してから i をインクリメントしています。

インクリメントした後に再度条件文を評価して、再度 true と評価されればまた同じコードブロックが実行されます。

上記のコードでは 3 回コードブロックが実行されて、i の値が 3 となったところで、条件文 ( i は 3 より小さい) が false となるために、 while ループの実行がおわり、プログラムが終了しています。

do - while 文

while 文の別のパターンとして、do-while 文というものがあります。

do {
     // ここを実行してから繰り返し条件文を評価
} while( 条件文 );

while 文と似ているのですが、異なる点はコードブロックが最低1回は実行されてから、条件文を評価するという点がことなります。

public class ControlFlow4 {

     public static void main(String[] args) {

          int i = 0;
          
          do {
               System.out.println( i );
               i++;
          } while( i < 3 );

     }

}

実行例は次のとおりです。

0
1
2

for 文

while と同じく繰り返し処理を行うために for 文というのもあります。for 文による繰り返し処理を for ループなどといいます。

for 文では変数の初期化、条件文、変数の変更 (インクリメント、デクリメントなど) をまとめて記述できます。

for( 変数の初期化; 条件文; 変数の変更 ) {
     // 条件文が真 (true) のときに実行されるコード
}

ループ処理を行う場合には、終了条件に正しく到達しないと永久にループを繰り返してしまいます。 このために、変数の初期化および条件文に関わる変数の値の変更は非常に重要です。

このため、上記の while 文の例のように単純に変数 i を繰り返し回数を数えるだけの目的で使用する場合 (この場合は i はカウンターであるなどといいます) は、for 文の利用を検討すると良いです。

上記の while 文での実行例を、for を使って書き換えると次のようになります。

public class ControlFlow5 {

     public static void main(String[] args) {

          for( int i = 0; i < 3; i++ ) {
               System.out.println( i );
          }

     }

}

実行例は次のとおりです。

0
1
2

for-each 文

コレクションまたは配列内の要素に対して、何かの処理を行う場合は拡張された for 文として、 for-each 文と呼ばれる形式を利用できます。

for( データ型 変数1 : コレクションまたは配列 ) {
     // コレクションまたは配列内のそれぞれの要素毎に
     // 変数1 が利用でき、全ての要素に対して処理が繰り返される
}

コード例は次のとおりです。

public class ControlFlow6 {

     public static void main(String[] args) {

          int[] a = { 1, 2, 3 };

          for( int i : a ) {
               System.out.println( i );
          }

     }

}

実行例は次のとおりです。

1
2
3

処理の継続と中断

上記繰り返し処理では、いずれも繰り返し処理を中断する場合は、繰り返しを指定するコードブロック内で break 文を呼ぶことで、 ループから抜けることができます。

また、処理を途中でスキップするとき等は continue を利用できます。

continue を利用した例として、次のコードを見てください。

public class ControlFlow7 {

     public static void main(String[] args) {

          int[] a = { 10, 20, 150, 300 };

          for( int i : a ) {
          
               if( i < 100 ) {
                    continue;
               }
          
               System.out.println( i );
          }

     }

}

実行結果は次のとおりです。

150
300

上のコードでは a という int の配列を用意しています。要素は 10, 20, 150, 300 です。

a に対して for-each ループを用いて、a 内のそれぞれの要素に対する処理を行っています。 ここでは、要素の値を System.out.println で出力しています。

しかしながら、要素が 100 より小さい場合は出力したくないとします。 この場合、ループは継続したいけれど、その後の処理(ここでは println を呼ぶこと)をしないで、 次のループに処理を移すために、continue を利用できるのです。

ホーム > Java の基本 > 処理の分岐