第4章 制御文

はじめに

構造化プログラミング言語では処理順次分岐反復という3つの基本構造があります。通常はmain()メソッドから開始し、上から順番に実行されます(順次)
この章では主に、分岐反復について学習していきます。

目次

  • 制御文とは
  • 分岐(条件分岐)
  • 反復(繰り返し)
  • 多重ループ(ネスト)
  • break文
  • continue文
  • 章のまとめ

目標

  • 制御文について利用できるようにすること
  • break文とcontinue文について理解すること

制御文とは

java言語は、一番最初にmain()メソッドを起点として上から下へ向かって1行づつ実行されます。ある条件によって実行したい処理が分かれる場合(分岐(条件分岐))や、繰り返ししたい処理がある場合(反復(繰り返し))には、制御文を利用します。

制御文には以下の種類かあります。

分岐(条件分岐)は、プログラムに指定された条件が成立するかしないかの判定により、各条件に応じた処理を行うことができます。それにより平坦な処理を、より柔軟で実用性のある処理にすることができます。

分岐(条件分岐)の構文としては、以下のとおりです。

  • if文
  • else-if文
  • switch文

プログラム内で、一連の処理を繰り返すことができる文を反復(繰り返し文)といいます。繰り返し文の利用により柔軟で読みやすいプログラムを記述することができます。また繰り返し文のことをループ文ともいいます。

反復(繰り返し文)の構文としては、以下のとおりです。

  • while文
  • do-while文
  • for文

分岐(条件分岐)

if文

if文(条件分岐)は「もしも〜なら」という意味で、if文の条件に該当する場合には{ }内の処理を実行するだけのとてもシンプルな構文です。

[if文の構文]

if(条件){
条件が成立(true)時に実行したい処理
}

例題(if文)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス IfExec01
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class IfExec01 {
/**
* mainメソッド
*/
public static void main(String[] args) {

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

if(i < 5){
System.out.println( i + "は5未満です。");
}

}

}

コンパイル例:

> javac chapter4¥IfExec01.java

実行例:

> java chapter4.IfExec01 3
3は5未満です。

else if文

if-else文(条件分岐)は「もしも〜ならA、それ以外はB」というように条件を2通りの処理から一つを選ぶ構文です。

[構文]

if(条件){
条件が成立(true)時に実行したい処理
}else{
条件が成立しなかった(false)時に実行したい処理
}

例題(if-else文)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス IfExec02
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class IfExec02 {
/**
* mainメソッド
*/
public static void main(String[] args) {

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

if(i < 5){
System.out.println( i + "は5未満です。");
}else{
System.out.println( i + "は5以上です。");
}

}

}

コンパイル例:

> javac chapter4¥IfExec02.java

実行例:

> java chapter4.IfExec02 3
3は5未満です。

> java chapter4.IfExec02 10
10は5以上です。

if-else if文

if文は条件がtrueの時とfalseの時の2通りにしか場合分けできません。3つ以上のケースに分けて処理しなければならない場合にはif-else if文を使用します。

if-else if文の構文は以下です。

[構文]

if(条件1){
条件1が成立(true)時に実行したい処理
}else if(条件2){
条件2が成立(true)時に実行したい処理
}else{
条件1も2も成立しなかった(false)時に実行したい処理
}

例題(if-else if文)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス IfExec03
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class IfExec03 {
/**
* mainメソッド
*/
public static void main(String[] args) {

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

if( i < 0 ){
System.out.println( i + "は0より小さいです。");
}else if ( i <= 15 ){
System.out.println( i + "は0〜15の間です。");
}else {
System.out.println( i + "は15よりも大きいです。");

}

}

}

コンパイル例:

> javac chapter4¥IfExec03.java

実行例:

> java chapter4.IfExec03 -1
3はは0より小さいです。

> java chapter4.IfExec03 5
5は0〜15の間です。

> java chapter4.IfExec03 20
20は15よりも大きいです。

{ }の省略

if文では条件分岐の内容を{}の間に書いていましたが、じょう処理が1つの場合には{}を省力することができます。

例題({ }の省略)

先ほど記述したプログラムからif文の{}を削除してください。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス IfExec03
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class IfExec03 {
/**
* mainメソッド
*/
public static void main(String[] args) {

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

if( i < 0 )
System.out.println( i + "は0より小さいです。");
else if ( i <= 15 )
System.out.println( i + "は0〜15の間です。");
else
System.out.println( i + "は15よりも大きいです。");


}

}

コンパイル例:

> javac chapter4¥IfExec03.java

実行例:

> java chapter4.IfExec03 -1
3はは0より小さいです。

> java chapter4.IfExec03 5
5は0〜15の間です。

> java chapter4.IfExec03 20
20は15よりも大きいです。

※ 実行結果は先ほどと同じです。

switch文

switch文は else if文と同じように複数条件を指定することができます。また、複数条件がある場合は、switch文を使用することによって、else if文をいくつも記述するより読みやすいプログラムを作成することができます。

switch文は1つの式を持ちます。この式には定数または変数を指定することができます。ただし、指定できるデータ型はbyte型、short型、int型、char型、String型、列挙型(enum)のみです。

処理は、式とcaseの定数値を評価し、一致する処理を実行します。どの case にも該当しない場合は、defaultの処理を実行します。(defaultの記載は省略可能です。)

尚、breakはswitch文の{ }の外へ抜ける命令です。
(switch文が実行されるとswitch文の処理が終了します。)

[構文]

switch (式){
case 定数1:
実行する文1;
実行する文2;
break;

case 定数2:
実行する文1;
実行する文2;
break;

}

例題(switch文)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス SwitchExec01
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class SwitchExec01 {
/**
* mainメソッド
*/
public static void main(String[] args) {

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

switch( n ) {
case 1:
System.out.println("1です。");
break;
case 2:
System.out.println("2です。");
break;
case 3:
System.out.println("3です。");
break;
default:
System.out.println("1、2、3以外です。");
}

}

}

コンパイル例:

> javac chapter4¥SwitchExec01.java

実行例:

> java chapter4.SwitchExec01 1
1です。

> java chapter4.SwitchExec01 2
2です。

> java chapter4.SwitchExec01 3
3です。

> java chapter4.SwitchExec01 4
1、2、3以外です。

例題(switch文(break文がない場合))

以下をコーディングし、break文がない場合の処理も確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス SwitchExec02
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class SwitchExec02 {
/**
* mainメソッド
*/
public static void main(String[] args) {

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

switch( n ) {
case 1:
System.out.println("1です。");
case 2:
System.out.println("2です。");
case 3:
System.out.println("3です。");
default:
System.out.println("1、2、3以外です。");
}

}

}

コンパイル例:

> javac chapter4¥SwitchExec02.java

実行例:

> java chapter4.SwitchExec02 1
1です。
2です。
3です。
1、2、3以外です。

> java chapter4.SwitchExec02 2
2です。
3です。
1、2、3以外です。

> java chapter4.SwitchExec02 3
3です。
1、2、3以外です。

> java chapter4.SwitchExec01 4
1、2、3以外です。

例題(switch文(複数のcase指定))

switch文のcaseを複数指定することも可能です。
以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス SwitchExec03
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class SwitchExec03 {
/**
* mainメソッド
*/
public static void main(String[] args) {

switch( args[0] ) {
case "AA":
case "BB":
System.out.println("入力された文字列はAAかBBです。");
break;
case "CC":
System.out.println("入力された文字列はCCです。");
break;
default:
System.out.println("入力された文字列はAA、BB、CC以外です。");

}

}

}

コンパイル例:

> javac chapter4¥SwitchExec03.java

実行例:

> java chapter4.SwitchExec03 AA
入力された文字列はAAかBBです。

> java chapter4.SwitchExec03 BB
入力された文字列はAAかBBです。

> java chapter4.SwitchExec03 CC
入力された文字列はCCです。

> java chapter4.SwitchExec03 DD
入力された文字列はAA、BB、CC以外です。

while文

while文(繰り返し文)は条件式の結果がtrueの間だけ { } 内の処理が実行され、
条件式の結果がfalseになったら処理が終了する文です。

[構文]

while (条件式) {
条件式の結果がtrueの時の処理
}

例題(条件演算子)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス whileExec01
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class whileExec01 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int i = Integer.perseInt(args[0]);
while(i > 0){
System.out.println("あと" + i + "回");
i--;
}

}

}

コンパイル例:

> javac chapter4¥whileExec01.java

実行例:

> java chapter4.whileExec01 5
あと5回
あと4回
あと3回
あと2回
あと1回

while文で注意すること

while文では条件式の書き方には注意が必要です。
例えば以下のソースコードでは無限ループに成ってしまいます。

package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class WhileExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

int n = 0 ;
while(true){
System.out.println(n);
}
}

}

上記の場合、条件式にtrueが指定されており、ずっと条件式がtrueのままになります。
条件式を指定する場合には無限ループにならないように注意しましょう。

また、while文では繰り返ししたい内容を{ }の間に書いていましたが、繰り返したい処理が1つの場合には{ }を省力することができます。

package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class WhileExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

int n = 0 ;
while(true)
System.out.println(n);

}

}

上記の場合、コンパイルエラーにはならず、実行はできます。(上記の場合、条件式がtrueですので実行すると無限ループが発生しますが、実行することは可能です。)

do-while文

whileを使うもう一つの構文としてdo文があります。
do-while文は一度条件式を実行した後で条件をチェックします。
少なくとも1回は「繰り返し実行したい処理」を実行するところが、while文と異なります。

[構文]

do {
繰り返したい処理
} while(条件);

do-while文の最後はセミコロン( ; )が付きます。

例題(do-while文)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス whileExec02
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class whileExec02 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int n = -5;

do{
System.out.println(n);
n ++;
}while( n < 0 );

}

}

コンパイル例:

> javac chapter4¥whileExec02.java

実行例:

> java chapter4.whileExec02
-5
-4
-3
-2
-1
0

ローカル変数の有効範囲について

変数には宣言される場所によって扱える範囲が異なります。

上記の場合、変数nはdo文で宣言している為、do文内{}(ブロック文)の範囲内でのみ使用できます。{}(ブロック文)の外では利用できないのでエラーになります。

尚、変数が使える範囲(有効範囲)をスコープといいます。またメソッド内で宣言している変数は一般的にローカル変数といいます。ローカル変数は変数宣言したブロック内で有効です。

do-while文の{ }の省略

do-while文も 繰り返したい処理が1つの場合には{}を省力することができます。

例題(do-while文の{ }の省略)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス whileExec03
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class whileExec03 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int n = -5;

do
n ++;
while( n > 0 );

System.out.println("n = " + n);

}

}

コンパイル例:

> javac chapter4¥whileExec03.java

実行例:

> java chapter4.whileExec03
-4

for文

for文とは反復処理の一種で、条件に一致した処理を繰り返し実行したい時に使用します。

for文の基本的な構文は以下です。

for(式1 ; 式2 ; 式3) {
式2の条件がtrueの時の処理
}

for文の処理の流れは、以下のとおりです。

  1. 「式1」でカウンタ変数の初期化が行われる。

  2. 「式2」で条件判定が行われる。判定が「true」の場合には次の処理に進み、「false」の場合にはfor文は終了する

  3. 2.での判定が「true」の場合、{ から } までの処理が実行される。

  4. 3.の処理の実行後、「式3」でカウンタ変数に対して増減が行われ、その後再び「式2」の条件判定が行われる。

  5. 「式2」の条件が「true」の間、2.から4.までの処理が繰り返される。

例題(for文)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス ForExec
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class ForExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

for(int a = 1; a < 5; a++){
System.out.println(a);
}

}

}

コンパイル例:

> javac chapter4¥ForExec.java

実行例:

> java chapter4.ForExec
0
1
2
3
4

{ }を書かないfor文

for文では、繰り返し実行したい内容を{ }の間に書いていました。{ }ブロックといい、複数の文を一つの文にまとめる働きがあります。繰り返したい処理が一行の場合には{ }を省力することもできます。

例題({ }を書かないfor文)

先ほど作成した「ForExec」クラスのfor文のブロック({ })を消して
実行してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス ForExec
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class ForExec {
/**
* mainメソッド
*/
public static void main(String[] args) {

for(int a = 1; a < 5; a++)
System.out.println(a);

}

}

コンパイル例:

> javac chapter4¥ForExec.java

実行例:

> java chapter4.ForExec
0
1
2
3
4

配列の要素の出力方法

配列の要素を出力する時はよく、先ほど学習したfor文を利用すると便利です。

例題(配列の要素をfor文で出力)

以下をコーディングし、実行結果を確認してみましょう。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス ArrayForExec1
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class ArrayForExec1 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int[] intArray = {10,20,30,40,50};

for(int a = 0; a < 5; a++){
System.out.println(intArray[a]);
}

}

}

コンパイル例:

> javac chapter4¥ArrayForExec1.java

実行例:

> java chapter4.ArrayForExec1
10
20
30
40
50

上記のfor文の式1で定義したカウンタ変数aは、012345と変わります。for文内でintArray[a]と指定することで効率よく配列intArrayへアクセスすることができます。

先ほど使用したfor文の反復条件をa < 5からa < intArray.lengthへ変更してください。

package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class ArrayForExec1 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int[] intArray = {10,20,30,40,50};

for(int a = 0; a < intArray.length; a++){
System.out.println(intArray[a]);
}
}

}

コンパイル例:

> javac chapter4¥ArrayForExec1.java

実行例:

> java chapter4.ArrayForExec1
10
20
30
40
50

先ほどと同じ結果がコンソールに表示されたと思います。配列名 + .lengthとすると、指定した配列の要素数を取得することができます。

for文の構文(応用)

最後にforの構文について復習も兼ねてもう一度解説します。

for文は初期設定反復条件後条件の3つの要素から出来ています。カウンタ変数の値を毎回決まった量だけ変化させながら反復処理を実行し、ループ制御変数があらかじめ決めておいた範囲を超えたときに反復を止めるという仕組みです。

初期設定

for文の開始にあたって1度だけ実行されます。ループ変数の初期値(最初の値)を設定します。

反復条件

「繰り返し実行したい処理」を実行する直前に、成立しているかどうか検査される条件でこの条件が満たされていなければfor文の繰り返しを止めます。

後条件

「繰り返し実行したい処理」を実行した直後に、無条件に実行される処理です。ループ変数の値を1づつ増やしたり、2つづつ増やしたり、減らしたり自由に増減することができます。

例題(for文の様々なパターン例)

//aが1つづつ増加するパターン
for(int a = 0; a < 10; a++){
System.out.println(a);
}

aが1つづつ減少するパターン

for(int a = 9; a > 0; a--){
System.out.println(a);
}

aが2つづ増加するパターン

for(int a = 0; a < 10; a+=2){
System.out.println(a);
}

状況に応じて使い分けられるように理解できるようにしてください。

拡張for文

拡張for文とはJava5.0から導入されたfor文で、配列ですべての要素を取り出す時のみ利用できる書き方です。

拡張for文は先頭から順番にアクセスできるのが特徴です。カウンター変数を使わないので、特定の要素にだけアクセスすることはできませんが、簡単に書ける利点があります。

ArrayForExec1クラスを以下のように修正してください。

ArrayForExec1.java

package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class ArrayForExec1 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int[] intArray = {10,20,30,40,50};

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

コンパイル例:

> javac chapter4¥ArrayForExec1.java

実行例:

> java chapter4.ArrayForExec1
10
20
30
40
50

break文

breakをforやwhileの中で使うと、繰り返しを停止する命令になります。
breakはひとつのブロック文({ }で囲まれた範囲)から、外側へ強制脱出する働きがあります。

for(int i = 0 ; i < 10 ; i++){

break;

}
while(条件式){

break;

}

例題(Break文(for))

新たにBreakExec01クラスを作成し、実際に以下を入力し実行してみてください。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス BreakExec01
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class BreakExec01 {
/**
* mainメソッド
*/
public static void main(String[] args) {

for(int i = 0 ; i < 10; i++){

if(i == 5){

break;

}

System.out.printlin("iは" + i + "です");

}

System.out.println("for文を終了しました。")

}

}

コンパイル例:

> javac chapter4¥BreakExec01.java

実行例:

> java chapter4.BreakExec01
iは0です。
iは1です。
iは2です。
iは3です。
iは4です。
for文を終了しました。

例題(break文(while文))

新たにBreakExec02クラスを作成し、実際に以下を入力し実行してみてください。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス BreakExec02
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class BreakExec02 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int i = 0;

while (i < 10){

i++;

if(i == 5){

break;

}

System.out.printlin("iは" + i + "です");

}

System.out.println("while文を終了しました。")

}

}

コンパイル例:

> javac chapter4¥BreakExec02.java

実行例:

> java chapter4.BreakExec02
iは1です。
iは2です。
iは3です。
iは4です。
while文を終了しました。

多重ループ

for文の中にさらにwhile文やfor文がある構造を多重ループ(またはネスティングネスト)といいます。
多重ループを利用することによって、より高度な繰り返し処理を行うことができます。

例題(多重ループ(for文の中にfor文の場合))

新たにNestExec01クラスを作成し、以下を入力し実行してみてください。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス NestExec01
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class NestExec01 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int i = 0, j = 0;

for(i = 0; i < 3; i++){

for(j = 0; j < 3; j++){

System.out.println("iは " + i + " jは " + j );

}

System.out.println("--------------");

}

System.out.println("各ループの処理が終了しました。");


}

}

コンパイル例:

> javac chapter4¥NestExec01.java

実行例:

> java chapter4.NestExec01
iは 0 jは 0
iは 0 jは 1
iは 0 jは 2
--------------
iは 1 jは 0
iは 1 jは 1
iは 1 jは 2
--------------
iは 2 jは 0
iは 2 jは 1
iは 2 jは 2
--------------
各ループの処理が終了しました。

例題(多重ループ(while文の中にfor文の場合))

新たにNestExec02クラスを作成し、以下を入力し実行してみてください。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス NestExec02
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class NestExec02 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int i = 0;

//外側のループ文
while(i < 3){

for(int j = 0 ; j < 5 ; j++){

System.out.println("iは " + i + " jは " + j );

}

System.out.println("--------------");
i++;
}



}

}

コンパイル例:

> javac chapter4¥NestExec02.java

実行例:

> java chapter4.NestExec02
iは 0 jは 0
iは 0 jは 1
iは 0 jは 2
iは 0 jは 3
iは 0 jは 4
--------------
iは 1 jは 0
iは 1 jは 1
iは 1 jは 2
iは 1 jは 3
iは 1 jは 4
--------------
iは 2 jは 0
iは 2 jは 1
iは 2 jは 2
iは 2 jは 3
iは 2 jは 4
--------------

例題(多重ループ(while文の中にfor文の場合(break)))

for文やwhile文のブロック内でbreak文が実行されるとブロックを抜けて次の処理へ移りますが、多重ループになっている場合にbreak文が実行された場合にどうなるのかを確認します。

新たにNestExec03クラスを作成し、以下を入力し実行してみてください。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス NestExec03
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class NestExec03 {
/**
* mainメソッド
*/
public static void main(String[] args) {

for (int i = 3; i <= 5; i++){

System.out.println(i + "の行開始");

for (int j = 1; j <= 9; j++){

if (i * j >= 10){
break;
}

System.out.println(i + "*" + j + "=" + (i * j));
}

System.out.println(i + "の行終了");

}

System.out.println("計算終了");

}

}

コンパイル例:

> javac chapter4¥NestExec03.java

実行例:

> java chapter4.NestExec03
3の行開始
3*1=3
3*2=6
3*3=9
3の行終了
4の行開始
4*1=4
4*2=8
4の行終了
5の行開始
5*1=5
5の行終了
計算終了

上記はfor文の中にfor文が記述されています。そして内側のfor文の中にbreak文が記述されています。この場合、for文が実行されると、for文を含んでいる一番内側の繰り返し処理だけを抜けて次の処理へ移ります。その為、break文が実行されたfor文の外にあるfor文の処理の流れには影響を及ぼしません。

ラベル付きbreak文

break文が実行されるとbreak文を含む一番内側のブロックを抜けますが、ラベル付きのbreak文にすることで任意のブロックを抜けることができます。

例題(ラベル付きbreak文)

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス NestExec04
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class NestExec04 {
/**
* mainメソッド
*/
public static void main(String[] args) {

outside:

for (int i = 1; i < 5; i++){
for (int j = 1; j < 5; j++){
int sum = i + j;

if (sum > 5){

System.out.println("break");
break outside;
}

System.out.println("i=" + i + " j=" + j + "i + j=" + sum);
}
}
}
}

コンパイル例:

> javac chapter4¥NestExec04.java

実行例:

> java chapter4.NestExec04
i=1 j=1i + j=2
i=1 j=2i + j=3
i=1 j=3i + j=4
i=1 j=4i + j=5
i=2 j=1i + j=3
i=2 j=2i + j=4
i=2 j=3i + j=5
break

ラベル付きbreak文が実行されると、指定されたラベルが付けられたブロックを抜けます。よって上記の場合はif文の条件式がtrueになると一番外側のfor文を抜けます。

continue文

continue文はforやwhileなどの中だけに使用することができます。continue文は処理をスキップしたい場合に使用します。

例題(continue文)

新たにNestExec05クラスを作成し、実際に以下を入力してください。

項目 名前
プロジェクト alj_study
パッケージ chapter4
クラス NestExec05
package chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class NestExec05 {
/**
* mainメソッド
*/
public static void main(String[] args) {

int i = 0;

while(i < 8 ){
i++;
if(i == 5){
continue;
}
System.out.println("iは" + i + "です。");
}

System.out.println("while文を抜けました。");

}
}

コンパイル例:

> javac chapter4¥NestExec05.java

実行例:

> java chapter4.NestExec05
iは1です。
iは2です。
iは3です。
iは4です。
iは6です。
iは7です。
iは8です。
while文を抜けました。

iが5の時は「System.out.println(“iは” + i + “です。”);」が実行されず、処理がスキップされています。

章のまとめ

以下の要点を理解できたら次の章へ進んでください。

制御文とは

  • 制御文には分岐(条件分岐)反復(繰り返し)がある
  • 制御文を組み合わせることで、柔軟実用性のある処理にすることができる
  • 分岐(条件分岐)にはif文else-if文switch文がある
  • 反復(繰り返し)にはwhile文do-while文for文がある

分岐(条件分岐)

if文(else文がない場合)

  • 条件式の結果によって処理を分岐させたい場合に使用する構文である
  • 条件式がtrueの場合はif文のブロック内の処理を実行する

if文(else文がある場合)

  • 条件式の結果がtrueの場合はif文のブロック内の処理を実行する
  • 条件式の結果がfalseの場合はelse文のブロック内の処理を実行する

else if文

  • 条件式がfalseの場合に別の条件式を指定することができる
  • else if文は多分岐を行うことができ、それぞれの条件に応じた処理を行うことができる

switch文

  • switch文は1つのを指定し、定数によって処理を分岐する
  • 式は定数または変数を指定する(byte型、short型、int型、char型、String型、列挙型のみ)
  • 処理は、式とcaseの定数値を評価し、一致する処理を実行する
  • どのcaseにも該当しない場合、defaultの処理を実行する(defaultの記述は省略可能)

反復(繰り返し)

while文

  • while文は条件式trueの場合は、while文のブロック内の処理が実行される
  • 処理が終了したのち、再び条件判定が行われ、条件式がfalseになるまで繰り返し処理される

do-while文

  • do-while文もwhile文と同様に、繰り返し処理を行うことができる
  • while文との違いは、繰り返し処理を実行した条件判定が行われる
  • do-while文の末尾には; (セミコロン)が必要である

for文

  • for文は3つの式を持ち、式1に初期値の設定、式2に条件判定、式3に再初期化の設定をする
  • 式1でカウンタ変数の初期化が行われる
  • 式2で条件判定が行われ、trueの場合 for文のブロック内の処理が実行される
  • ブロック内の処理が実行された後、式3で再初期化の設定処理が行われる

拡張for文

  • 配列コレクション全要素の値を参照する際には、拡張for文を利用する
  • 変数宣言の型は、配列の要素の型を指定する
  • 変数宣言と配列名(コレクション)の間は:(コロン)で区切る

多重ループ(ネスト)

  • 多重ループ(ネスト)制御文を入れ子にして使用する機能のこと
  • for文やwhile文、do-while文などの各文を入れ子にすることで高機能な繰り返しが可能

break文

  • break文は、現在実行中の繰り返し処理から抜け、繰り返し処理の次の実行文に制御を移す
  • while文、do-while文、for文、拡張for文などの繰り返し部分に記述すると、繰り返しから抜けることができる
  • switch文のcase内に記述することでswitch文から抜けることができる
  • ラベル付きのbreak文にすることで、任意のブロックを抜けることができる
  • ラベルを設定する場合は ラベル名 :(コロン) を指定する
  • ラベル付きのbreak文を実行したい場合は、break ラベル名 ; を指定する

continue文

  • continue文は、現在実行中の繰り返し処理から抜けず、最も内側の繰り返し処理の構文の最後に制御を移し、繰り返し処理を継続する
  • while文、do-while文、for文、拡張for文などの繰り返し部分に記述することができる