Java では、自身のプロセスを終了させる方法として、exit メソッドが用意されています。また、関数やループと途中で抜ける場合では、return や break 構文を使用します。
この記事では、用途に合わせて処理を途中で終了させる方法を解説します。
exitメソッド
exitメソッドはプログラムを強制的に終了させるときに使用します。
このメソッドを使用すると、プロセスが引数に指定した戻り値で強制的に終了します。
実際にexitメソッドでプロセを終了すサンプルコードを見ていきましょう。
public class Main {
public static void main(String[] args) {
System.out.println("exit 実行前のメッセージ");
System.exit(0);
System.out.println("exit 実行後のメッセージ(表示されない)");
}
}
上のコードを実行すると次のような結果になります。
exit 実行前のメッセージ
このように、exit メソッドは、そこでプログラムを終了させ、その後の処理は実行されません。
exit はfinally 節も実行されない
Java では、try-catch構文で finally を書くことで、例外の発生有無に関わらず、最後に必ず実行される処理を定義することができます。
試しに、次のような例外が発生する処理を実行させて finally ブロックの処理が実行されるか確認してみましょう。
public static void main(String[] args) {
try {
// わざとゼロ除算を行い、例外が発生する処理を行う
int a = 1;
int b = 0;
int c = a / b;
} catch (Exception e) {
// 例外が発生した時の処理
System.out.println("例外が発生しました");
} finally {
//例外の有無に関わらず、最後に必ず実行される処理
System.out.println("finallyが実行されました");
}
}
実行結果
例外が発生しました
finallyが実行されました
ただし、exit を使った場合は例外で、finallyブロック内の処理は実行されずに、即座にプロセスが終了します。
try ブロックの中で、 exit メソッドを呼んだ場合の動きを確認してみましょう。
public static void main(String[] args) {
try {
System.out.println("exit実行前のメッセージ");
System.exit(0);
} catch (Exception e) {
// 例外が発生した時の処理
System.out.println("例外が発生しました");
} finally {
//例外の有無に関わらず、最後に必ず実行される処理
System.out.println("finallyが実行されました");
}
}
実行結果
exit実行前のメッセージ
メソッドを抜ける return
次は、return について見ていきましょう。
return 文は、現在実行されているメゾットを終了し、呼出元のメソッドに制御を戻すときに使用します。
また、戻り値があるメソッドでは、return の呼び出し時に、戻り値も合わせて指定します。
returnのサンプルコード
では、return でメソッドの処理を途中で抜け、
呼び出し元のメソッドに戻り値を返すこ例を見ていきましょう。
public static void main(String[] args) {
//戻り値がないメソッドの呼び出し
test1(1, 2);
//戻り値があるメソッドの呼び出し
int ret = test2(3, 4);
System.out.println("test2の戻り値=" + ret);
}
//戻り値がないメソッド
public static void test1(int a, int b) {
System.out.println(a + b);
return;
}
//戻り値があるメソッド
public static int test2(int a, int b) {
//戻り値があるメソッドの場合は、return に戻り値を指定する
return a + b;
}
return はfinally 節も実行される
前の章で解説した exit とは異なり、return は try-catch ブロック内で処理を抜けな場合にも、
finally ブロックの処理が実行されます。
public static void main(String[] args) {
try {
System.out.println("return 実行前のメッセージ");
return;
} catch (Exception e) {
// 例外が発生した時の処理
System.out.println("例外が発生しました");
} finally {
//例外の有無に関わらず、最後に必ず実行される処理
System.out.println("finallyが実行されました");
}
}
実行結果
return 実行前のメッセージ
finallyが実行されました
繰り返し処理の途中で抜ける break
break 文は for 文や while 文などの繰り返し処理を、途中で抜ける為のものです。break が呼ばれると、繰り返しの終了条件を無視して、その時点で繰り返し処理を終了します。
次の例は、変数 i が 5 なった時点で for 文の繰り返しを break で抜けるサンプルコードです。
public static void main(String[] args) {
for (int i = 0; i < 10; i++){
System.out.println("i=" + i);
if (i == 5) {
break;
}
}
System.out.println("for ループが終了しました");
}
実行結果
i=0
i=1
i=2
i=3
i=4
i=5
for ループが終了しました
入れ子になった繰り返しの場合は、内側のループだけを抜ける
2つ以上のfor や while などが入れ子になった繰り返しで break を実行した場合は、最も内側のループから抜けます。つまり、外側のループからは抜けることはできないため、次のようなコードの場合、その側のループは、終了条件を満たすまで繰り返し処理を続けます。
public static void main(String[] args) {
for (int i = 0; i < 3; i++){
System.out.println("i=" + i);
for (int j = 0; j < 3; j++) {
if (j == 1) {
break;
}
}
}
System.out.println("for ループが終了しました");
}
もし、入れ子になったループの中で、特定の条件に達した時に、すべてのループから脱出したい場合は、入れ子になった数だけ break 文を実行する必要があります。
まとめ
exit 処理の途中でプロセスを終了させる方法や、return や break でメソッドや繰り返し処理を抜ける方法を解説してきました。
この記事で紹介したように、処理を抜ける用途によって使用するメソッドや構文が異なるため、その役割を理解して使い分けていきましょう。
上の例では、main メソッド内で exitメソッドを呼び出していますが、それ以外のメソッドから呼ばれた場合でも、exitメソッドは、その時点でプロセスを終了します。