Step 6: プログラムは見やすくね!

さらに、退屈な話が続きます。プログラムの処理の流れを記述する上で必要な制御文をちょっと説明します。
これもどの言語でも同じでしょ?(いつも通りこの色は美樹ちゃん)
そうだね、プログラムを書く上では欠くことができないのが制御文。

説明する前に、ちょっと気にしておいて欲しいのが、他人が見てもみやすいプログラムを記述するようにすること。

など、ソースを記述する上でのコーディングスタイルを決めておくことで、他の人にもわかりやすく、デバッグもしやすいものとなるからね。

Section 1: if - else

「もし〜だったら〜」 というように、条件に従って処理を選択しながら実行したい時に使用します。if 文は以下の三通りの記述方法があります。

if ( 式 ) {
    式が真だったらここを実行;
}
if ( 式1 ) {
    式1が真だったらここを実行;
}
else {
    式1が偽だったらここを実行;
}
if ( 式1 ) {
    式1が真だったらここを実行;
}
else if ( 式2 ) {
    式1が偽で式2が真だったらここを実行;
}
else {
    式1も式2も偽だったらここを実行; 
}

else if 文を利用することで、三つ以上の任意の数の条件式を処理することができます。また、条件に記述できる式は値が boolean (真か偽)になるものでなければなりません。

if 文を使用する際、条件が真や偽の時に実行される文が単文(一行)の場合 { } を省略できます。しかし、プログラムを見やすく(わかりやすく)するために { } を省略することはお勧めしません。

Section 2: switch

else if 文を利用して複数の条件を処理することができるが、else if 文の多用はプログラムを見にくくする場合があります。そんな時に switch 文を利用することでプログラムを非常に見やすくします。ただし、利用できるのは式の値が数値や文字(定数)の場合のみです。値が、文字列定数の場合は利用できません。

switch ( 式 ) {
    case 定数1:
        式の値が「定数1」だったらここを実行;
        break;

    case 定数2:
        式の値が「定数2」だったらここを実行;
        break;

    case 定数3:
    case 定数4:
        式の値が「定数3」または「定数4」だったらここを実行;
        break;

    case 定数5:
        式の値が「定数5」だったらここを実行;
    case 定数6:
        式の値が「定数5」または「定数6」だったらここを実行;
        break;

    default:
        式の値が上記以外だったらここを実行;
        break;
}

switch 文は、break 文を何処に記述するかによって実行される文が異なります。

Section 3: while

ある条件がみたされている間、処理を繰り返し実行するには while 文を利用します。

while ( 式 ) {
        式の値が偽になるまでここを実行;
}

条件に記述できる式は値が boolean (真か偽)になるものでなければなりません。式の値が真である時は { } (ブロック)で囲まれた部分を繰り返し実行し、偽(false)になった時に繰り返しを止めます。式が 1や true の場合、永久ループになります。

while 文もまた、条件が真の時に実行される文が単文(一行)の場合 { } を省略できます。しかし、プログラムを見やすく(わかりやすく)するために { } を省略することはお勧めしません。

Section 4: do - while

while 文と同じように、ある条件がみたされている間 処理を繰り返し実行するが、条件に関係なく一度ループする文を実行してから式が評価されます。

do {
        式の値が偽になるまでここを実行;
} while ( 式 );

条件に記述できる式は値が boolean (真か偽)になるものでなければなりません。式の値が真である時は { } (ブロック)で囲まれた部分を繰り返し実行し、偽になった時に繰り返しを止めます。

Section 5: for

while 文と同じように、ある条件がみたされている間、処理を繰り返し実行するループ制御文です。

for ( 式1; 式2; 式3 ) {
        式2の値が偽になるまでここを実行;
}

式1は初期設定で、ループを始める前に一度だけ実行されます。式2は繰り返し実行を続けるための条件となり、式2の値が真である時は { } (ブロック)で囲まれた部分を繰り返し実行し、偽になった時に繰り返しを止めます。式3は、繰り返し実行される文が一度実行されるたびに実行されます。

for 文の三つの式は、省略することができます。しかし、式の区切りであるセミコロン(;) を省略することはできません。for (;;) と記述すると永久ループになります。

for 文もまた、条件が真の時に実行される文が単文(一行)の場合 { } を省略できます。しかし、プログラムを見やすく(わかりやすく)するために { } を省略することはお勧めしません。

Section 6: break と continue

while, do-while, for といったループ文や switch 文からただちに抜け出したい時に break 文を利用します。 もし、ループ文が入れ子になっている場合、一番内側のループから抜けます。

while (true) {
    i = i + j;
    if ( j > 6 ) {
        break;                       // j が6より大きくなったらループを抜ける
    }
    j++;
}

入れ子になっているループから一度で抜けたい時は、ラベルを利用することができます。ラベルの終わりにコロン(:) が必要です。抜けたいところにラベルをつけ、break 文でそのラベル名を指定します。

    for (int i=0; i<100; i++) {
        for (int j=0; j<100; j++) { 
            if ( src[i] == dist[j] ) {
                break match;        // 同じ要素を見つけたら、二重ループを抜ける
            }
        }
    }
match:

ループ中で、ある条件の時に一連の繰り返しを中断してループの先頭に戻りたい時に continue 文を利用します。break 文が、ループから抜けるのに対して、continue 文は繰り返し中の処理を中断して次のループ処理に入ります。

for (int i=0; i<100; i++) {
    if ( data[i] < 0 ) {
        continue;                    // 要素が 0 より小さい時、for 文の i++ に移る
    }
    // 処理が続く
    ....
}

continue 文もラベルが利用できるので、二重ループの外側のループに戻ることができます。

looptop:
    for (int i=0; i<100; i++) {
        for (int j=0; j<100; j++) { 
            if ( src[i] == dist[j] ) {
                continue looptop;   // 同じ要素を見つけたら、外側のループの i++ に移る
            }
        }
    }

Section 7: 例外処理(try, catch, finally)

Java は、エラー処理を制御する try, catch という例外処理の機構があります。tryブロック により、例外が発生する可能性のある処理を記述します。例外が発生すると、catchブロックに記述された処理が呼び出されます。catchブロックは複数記述でき、発生した例外クラス(Exceptionクラス)によってどの catchブロックが選択されるか決定されます。catchプロックを並べる時、Exception クラスのサブクラスから記述しなければなりません(スーパークラスほど下に記述する)。互いに継承関係がない場合、どちらが先でも構いません。例外処理のスーパークラスである Exception を記述する場合、catchブロックの一番最後に記述します。Exception は、Throwable のサブクラスです。最後に、finally ブロックに記述された処理は、try ブロックが、例外が発生した場合でも正常に終了した場合でも必ず呼び出されます。例えば、ファイルをクローズする処理を記述しておけば、正常に処理が行われても、エラーが起きても必ずファイルをクローズすることができます。

try {
    文
}
catch ( 例外クラス 変数 ) {
    例外処理
}
catch ( 例外クラス 変数 ) {
    例外処理
}
finally {
    後処理
}

例外を発生させるには、メソッドに throw を実行させます。throw を実行するメソッドは、どんな例外を発生するのか throws によって宣言する必要があります。

public method() throws MyException { 
    ...
    throw new MyException;
        ...
}

既存の例外処理クラスではなく、独自の例外処理を記述する場合、Exceptionクラスのサブクラスとして定義する。Throwable クラスのサブクラスとしないのは、Errorクラスと区別するため。

Section 8: コメント

コメント(注釈)は、プログラミングをする上で非常に重要なものです。内容や処理の説明をソースコード中にコメントととして記述することで、デバックや保守をすることが楽になります。コメントを記述するには三種類の方法があります。

/** で始まり */ で終わる部分(宣言の前でしか使えないコメント。javadoc にて利用する。)

/**
 * Sets the tool tip text.
 *
 * @param text  The text of the tool tip.
 */
public void setToolTipText(String text) {

/* で始まり */ で終わる部分

/* comment is here */
i++;
/* start comment
   bra bra bra
   end of comment   */

// で始まって行の終わりまでの部分

i++;    // comment until end of line

次回は、クラスとインターフェースについて説明します。これで、Java の言語としての簡単な説明を終わりにして、サンプルプログラムを多用して Java によるプログラミングを紹介していきます。

[Prev] [Next]