コメントと制御文でJavaプログラムに“命”を吹き込め!携帯アプリを作って学ぶJava文法の基礎(4)(3/3 ページ)

» 2008年04月15日 00時00分 公開
[緒方聡エスマテック株式会社]
前のページへ 1|2|3       

「break」文は途中だけどやめる

 「switch」文の説明の章で「break」文を少しだけ紹介しました。「break」文は主に「途中だけどやめる」という処理を表しますが、ラベルを付けることできめ細かく制御できます。構文は以下のようになります。

break;
break ラベル;

 ラベルなし「break」文は、最も内側の「switch」文や「while」文、「do」文、「for」文を抜けます。

 実際のコードで見てみましょう。以下は195行目からの引用です。

195 for (int i = 0; i < FIELD_HEIGHT; i++) {
196
    boolean complete = true;
197
    for (int j = 1; j < FIELD_WIDTH - 1; j++) {
198
        if (field[i][j] != 2) {
199
            complete = false;
200
            break;
201
        }
202
    }
203
    if (complete) {
204
        eraseLines[index++] = i;
205
    }
206 }

 200行目にラベルなし「break」文があります。引用したコードは「for」文の中に「for」文が“入れ子”になっているのですが、この「break」文は一番内側の、197行目の「for」文を抜ける役割を持っています。

 なお、この処理は、ブロックが1列そろったかどうかを判定しており、一番左側からブロックがあるかどうかを見て、なければそれ以上見るのをやめています。

図3 ライン消去判定 図3 ライン消去判定

 ここでは、「break」文を使用して、それ以上無駄な処理を行わなくてもよくしています。

ラベル付きの「break」文

 次は、ラベル付きの「break」文です。ラベル付きの「break」文は、ラベルが付けられている場所に制御を移します。以下の例を見てみましょう。

 1 label: for (int i = 0; i < 5; i++) {
 2     for (int j = 0; j < 3; j++) {
 3         for (int k = 0; k < 4; k++) {
 4             if (i == j && j == k && i == k) {
 5                 System.out.println("i=" + i + " j=" + j + " k=" + k);
 6                 break label;
 7             }
 8         }
 9     }
10 }

 1行目の「for」文にラベルが付いています。「識別文字列+:(コロン)」を文の前に記述すると、それがラベルなります。この例では、「label:」としていますが、任意のラベル名を付けることができます。

 6行目にラベル付き「break」文が書かれています。通常の「break」文なら、一番内側(3行目)の「for」文を抜けるのですが、この場合は「label」の位置に制御を移し、1行目の「for」文を抜けることになります。

「continue」文は、次行ってみよう

 「continue」文は、「while」文や「do」文、「for」文の繰り返し処理の内部にだけ記述ができる、次の繰り返しへ制御を移動する構文です。「continue」文も「break」文と同じく、ラベルなしとラベル付きの構文があります。

continue;
continue ラベル;

 以下の例を見てみましょう。

1 label: for (int i = 0; i < 5; i++) {
2
    for (int j = 0; j < 3; j++) {
3
        if (j % 2 == 0) continue;
4
        if (i == j) continue label;
5
        System.out.println("i=" + i + " j=" + j);
6
    }
7 }

 1行目の「for」文に「label」というラベルが付けられています。ここには、4行目のラベル付き「continue」文で制御が移動します。3行目のラベルなし「continue」文は、一番内側の、つまり2行目の「for」文を次の繰り返しへと進めます。

 ラベル付き「continue」文は、次の繰り返し処理を行う点で、ラベル付き「break」文と使い分けることができます。

「return」文は処理を終える

 「return」文は、コンストラクタまたはメソッドを終了して、そのメソッドの呼び出し元に処理を戻します。構文は以下のようになります。

return;
return 式;

 式なしの「return」文は、コンストラクタ内か戻り値がvoidのメソッド内でのみ使用することができます。式付きの「return」文は、式が表す型がメソッドの戻り値の型と一致しなければなりません。

 実際のコードの254行目のメソッドを見てみましょう。

254 boolean isHit(int x, int y, int[][] omino) {
255
    for (int i = 0; i < omino.length; i++) {
256
        for (int j = 0; j < omino[i].length; j++) {
257
            if (omino[i][j] == 1) {
258
                if (field[y + i][x + j] == -1 || field[y + i][x + j] == 2) {
259
                    return true;
260
                }
261
            }
262
        }
263
    }
264
    return false;
265 }

 上記は、落下中のブロックが積み上げられているブロックにめり込んだかどうかを判定するメソッドで、めり込んでいる場合はtrueを、めり込んでいない場合はfalseを返します。いわゆる衝突判定を行うメソッドです。

 255行目からの「for」文で、落下中のブロックと積み上げられているブロックの衝突判定を行い、衝突していると判定できたら259行目でtrueを返し、このメソッドを即座に終了し、制御を呼び出し元に戻します。すべてのパターンが判定され、衝突していないことが分かると264行目でfalseを返しています。

もう少し難しい文は後ほど……

 Javaには今回説明した文以外に、概念と文法を一緒に覚えなければならない文が3つあります。それらは、「try」文や「throw」文、「synchronized」文です。これらは「例外」と「スレッド」という、Javaでは習得必須の機能を制御するための文ですが、もう少し後になってから説明することにします。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。