Previous |Next |Trail Map |Writing Java Programs | Java 言語のナットとボルト


制御フロー文

文字数を数えるプログラムでは、文字の入力とカウントを繰り返し行うために while 文を使用している。

class Count {
    public static void main(String args[])
        throws java.io.IOException
    {
        int count = 0;

        while (System.in.read() != -1)
            count++;
        System.out.println("Input has " + count + " chars."
);
    }
}

一般に、ある条件が真である場合while 文は動作を行う。 while 文の構文は次のようになる。

while (expression)
    statement

すなわちexpressionが真の場合は、statementを実行する。 文字を数えるアプリケーションで 、 System.in.read() メソッドが - 1 でない値を返す間、プログラムは countを増分する。

文字数を数えるコード例に示されるように、statement は1文、あるいは文ブロックになる。 文ブロックは、大括弧( '{' と ''})内に含まれる一 連の正当な Java の文である。 例えば、 while ループ 内の countを増分するほかに、文字が読み込まれるたびにcountを表示するとを考える。これは、次のように書くことができる。

. . .
while (System.in.read() != -1) {
    count++;
    System.out.println("Read a character. Count = " + count);
}
. . .

慣習により、始まりの大括弧 '{' は while 文と同じ行の最後に書き、終わり の大括弧は上記のように while と並べるために次の行でインデントされる。

while 文のような文は、他の文が実行される順序を決定する制御フロー文である。 whileのほかに Java 言語では、次のような制御フロー文をサポートする。

  Statement             Keyword
decision making    if-else, switch
loops              for, while, do-while
exceptions         try-catch-finally, throw
miscellaneous      break, continue, label:, return

注釈: goto は予約語であるが、現在 Java 言語では goto文 をサポートしていない。 その代わりに ラベルを付きbreak文 を使用する 。

if else 文

Java の if - else 文が、ある基準に基づいて他の文を選択的に実行 する能力をプログラムに提供する。 例えば、プログラムが DEBUG という論理型の変数の 値に基づいてデバック情報をプリントすると仮定する。 もし DEBUG が true に セットされたなら、プログラムは変数xの値というようなデバック情報をプリ ントする。そうでなければ、プログラムは普通に進行する。 これを実装するコードのセグメントは次 のようになるであろう。

. . .
if (DEBUG
 == true)
    System.out.println("DEBUG: x = " + x);
. . .

これは if文 の最も単純なものである。 ifによって制御される文は 、条件が真であるとき実行される。 一般に、ifの簡単な形式は次のように書かれる 。

if (expression)
    statement

expressionが偽の場合、別の statement を実行したかったらどうする? そのために else 文 を使用することができる。 もう1つの例を見よう。 ユーザが警告ウィンドウで OK ボタンあるい は Cancel ボタンをクリックしたかどうかにより、プログラムが異なった動作を行う必要があると仮定する。 プログラムは if文 を使用してこれを行うことができる。

    . . .
    // response is either OK or CANCEL depending
    // on the button that the user pressed
    . . .
if (response
 == OK) {
    . . .
    // code to perform OK action
    . . .
} else {
    . . .
    // code to perform Cancel action
    . . .
}

このような else 文 の使用はもれなくすべてを受けとめる形式である。 ifの条件が偽であるなら、 else ブロックが実行される。 else 文にはもう1つの形式があり、 else if はもう1つの式 に基づいて文を実行する。 例えば、90% 以上の得点にはA、80%以上にはBのように、テストの得点 をもとに等級を割り当てるプログラムを書くと仮定する。このコードを書くために else if 文を伴う if 文とelse文を使用すること ができる。

int testscore;
char grade;

if (testscore >= 90) {
    grade = 'A';
} else if (testscore >= 80) {
    grade = 'B';
} else if (testscore >= 70) {
    grade = 'C';
} else if (testscore >= 60) {
    grade = 'D';
} else {
    grade = 'F';
}

if文には else if 文を任意の数だけもつことができるが、 else は1つしかもてない。 testscore の値は、複合されたif 文の1つ以上の式を満たしていることに気づいたかもしれない。 例えば、76 点はif文の 2つの 式で true と評価される。2つの式は、 testscore >= 70testscore >= 60である。 実行時システムがこのような複合されたif文を処理すると、一度条件が満たされれば(76 >= 70)、それに適した文が実行され (grade = 'C';)、他の条件を評価せずに制 御はif文 の外へ制御が渡る。

switch 文

ある式に基づいた文を条件付きで実行するために switch 文 を使用する。 例えば、ある日 付の月を表す値を整数monthに持つプログラムがあるとする。 さらにその 整数に相当する月の名前を表示すると仮定する。 これを実行するために Java の switch 文 を使用することができる。

switch (month) {
case 1: System.out.println("January");
    break;
case 2: System.out.println("February");
    break;
case 3: System.out.println("March");
    break;
case 4: System.out.println("April");
    break;
case 5: System.out.println("May");
    break;
case 6: System.out.println("June");
    break;
case 7: System.out.println("July");
    break;
case 8: System.out.println("August");
    break;
case 9: System.out.println("September");
    break;
case 10: System.out.println("October");
    break;
case 11: System.out.println("November");
    break;
case 12: System.out.println("December");
    break;
}

この場合、 switch 文 はその式つまり month の値を評価し、一致する case 文 を実行する。 もちろん if 文としてこれを実装することがで きる。

if (month
 == 1) {
    System.out.println("January");
} else if (month == 2) {
    System.out.println("February");

. . .
// you get the idea
. . .

しかし、 switch 文 の方がより効率的である。 それぞれの case 文 は一意でなければならない。そして各 case 文に与える値は、 switch 文 に与えた式が返すデータ型と同じデータ型で なければならない。

switch 文のもう1つの興味深いポイントは、各 case文の後にある break 文 である。 break 文 は制御が switch から抜け出し、スイッチの後に続いている 最初の文を続行する。 case 文は、次の文へ落ちていくだけなので、break 文 は必要である。 すなわち 、明示的な break 文がないと、 制御は次の case 文 へと連続的に流れる。 前の例で、1つの case から次に流れる制御をしたくないので、 break 文 を付け加えなければなら ない。 しかし、 case 文 を通して連続的に続行する制御をしたいときは特定の方法があ る。 これを、「 Thirty days hath September.. 。」で始まる古い詩に従って、1月の日数を計算するこのコードで示す。

int numDays;

switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
    numDays = 31;
    break;
case 4:
case 6:
case 9:
case 11:
    numDays = 30;
    break;
case 2:
    if ((year % 4)
 == 0 && (year % 100) != 0) [PENDING check this algorithm]
                          numDays = 29;
                      else
                          numDays = 28;
                      break;
                  }

最終的に、 case 文 によって処理されないすべての値を処理するために 、 switch の最後に default 文を使用することができる 。

switch (month) {
case 1: System.out.println("January");
    break;
case 2: System.out.println("February");
    break;
case 3: System.out.println("March");
    break;
case 4: System.out.println("April");
    break;
case 5: System.out.println("May");
    break;
case 6: System.out.println("June");
    break;
case 7: System.out.println("July");
    break;
case 8: System.out.println("August");
    break;
case 9: System.out.println("September");
    break;
case 10: System.out.println("October");
    break;
case 11: System.out.println("November");
    break;
case 12: System.out.println("December");
    break;
default: System.out.println("Hey, that's not a valid month!"
);
    break;
}

ループ文

上で Java の while 文 を説明した。 Java には、その他にforループと do-while ループの 2 つの構文をプログラムで使用することができる。

最初に、forループを説明する。 ループの制約(初期化命令、終了基準、増分命 令)がわかっているとき、forループを使用する。 例えば、for ループは配列の要素やString内の文字などを繰り返すためにしばしば使用される。

// a is an array of some kind
. . .
int i;
int length = a.length();
for (i = 0; i < length; i++) {
    . . .
    // a is an array of some kind
    . . .
}

配列の先頭から最後まですべての要素に対して行いたいプログラムを作成するとき、 for文の使用は良い選択である。for 文の一般的な形式は次のように表現できる。

for (initialization; termination; increment)
    javaStatements

initializationはループを初期化する文である。ループの始めに一度実行される。 terminationはいつループを終了するべきか判定する式である。 この式 はそれぞれのループの繰返しの始めに評価される。式が false と評価する と、forループは終了する。 最終的に、 incrementはループをを繰り返す度に実行される式である 。 これらの任意の(あるいはすべての)構成要素が空文になることができる。

Java はもう1つのループであるdo-whileループをを提供する。このループは前に 説明したwhileに似ているが、式がループの一番下で評価される点が異なる。

do {
    javaStatements
} while (expression);

do-while文は、プログラムでループを構成するためにはあまり使用されないが利点がある。 例えば、 do-while は、ループが少なくとも1度実行されなくてはならない 文を使用するときには都合が良い。 do-while の例を示す。

do {
    [PENDING: think of do-while example]
} while ();

例外処理文

Java メソッドでエラーが発生すると、メソッドは、throw 文を使用しているエラーが発生したことを 呼び出し側に示すために例外をあげることができる。 呼び出しているメソッドは 例外をキャッチして処理するために、 trycatchfinallyを使用する。 例外のあげ方と処理についての情報については、 例外を使用したエラー処理 を参照のこと。

文の分岐

前述の switch 文 内に break 文 について説明した。 そこで注意したように、 break が制御の流れを現在の文のすぐ後に実行する文へ分岐させる。

制御の流れをラベル付き文に分岐させるもう1つの break 文 の形式が ある。 文の前にコロン (:) がついている正当な Java の識別子(ラベル)を配置することにより 、文にラベルをつける。

breakToHere: someJavaStatement 

breakToHere というラベルを付けた文にジャンプするには、 break 文 の次の形式を使用する。

break breakToHere;

ラベルを付けた break 文は Java 言語によってサポートされない goto 文に代わる ものである。

現在の文からループの先頭にジャンプするには、ループ内での continue文 を使用す る。 これには、continueに続くループ内のコードをスキップする効果がある。

 [PENDING: do continue example]

最後に、Javaの分岐文であるreturn文が残った。 現在のメソッドを終了し、本来のメソッド呼び出しに従う呼び出しメソッド内の文に戻るために、 return を使用する。 return には値を返すものとそうでない 2 つの形式がある。 値を返すには、 return キーワードの後に値を計算する値(あるいは式)を入れる。

return count++;

return によって返される値は、宣言されたメソッドの返り値のタイプと一致し なくてはならない。

メソッドが void と宣言される時、値を返さない return 形式を使用する。

return;


Previous |Next |Trail Map |Writing Java Programs | Java 言語のナットとボルト