System.exit()へのガイド

1. 概要

このチュートリアルでは、Javaでの_System.exit_の意味を見ていきます。
その目的、使用場所、使用方法を確認します。 また、異なるステータスコードで呼び出した場合の違いも確認します。

2. _System.exit_とは何ですか?

_System.exit_は_void_メソッドです。 終了コードを受け取り、呼び出し元のスクリプトまたはプログラムに渡します。
*ゼロのコードで終了すると、通常の終了を意味します:*
System.exit(0);
メソッドへの引数として任意の整数を渡すことができます。 *ゼロ以外のステータスコードは異常終了と見なされます。*
_System.exit_メソッドを呼び出すと、現在実行中のJVMが終了し、プログラムが終了します。 このメソッドは正常に戻りません。
これは、* _ System.exit_の後の後続のコードが事実上到達不能*であるにもかかわらず、コンパイラーがそれについて知らないことを意味します。*
System.exit(0);
System.out.println("This line is unreachable");
  • System.exit(0) でプログラムをシャットダウンすることはお勧めできません。 _main_メソッドを終了した場合と同じ結果が得られ、後続の行の実行も停止します。また、 JVMが終了するまで_System.exit_ブロックを呼び出すスレッドも停止します。 シャットダウンフックがこのスレッドにタスクを送信すると、デッドロックが発生します。 *

3. なぜ必要なのですか?

_System.exit_の典型的な使用例は、異常な状態があり、プログラムをすぐに終了する必要がある場合です。
また、mainメソッド以外の場所からプログラムを終了する必要がある場合、_System.exit_はそれを達成する1つの方法です。

4. いつ必要ですか?

スクリプトは、呼び出すコマンドの終了コードに依存するのが一般的です。 そのようなコマンドがJavaアプリケーションの場合、_System.exit_はこの終了コードを送信するのに便利です。
たとえば、例外をスローする代わりに、異常終了コードを返すことができます。この異常終了コードは、呼び出し元のスクリプトで解釈できます。
または、_System.exit_を使用して、登録したシャットダウンフックを呼び出すことができます。 これらのフックは、保持されているリソースをクリーンアップし、他の非link:/java-daemon-thread[daemon]スレッドから安全に終了するように設定できます。

5. 簡単な例

この例では、ファイルを読み取ろうとし、ファイルが存在する場合はその行を出力します。 ファイルが存在しない場合、catchブロックの_System.exit_を使用してプログラムを終了します。
try {
    BufferedReader br = new BufferedReader(new FileReader("file.txt"));
    System.out.println(br.readLine());
    br.close();
} catch (IOException e) {
    System.exit(2);
} finally {
    System.out.println("Exiting the program");
}
ここで、ファイルが見つからない場合、finallyブロックは実行されないことに注意する必要があります。 catchブロックの_System.exit_はJVMを終了し、_finally_ブロックの実行を許可しないためです。

6. ステータスコードの選択

ステータスコードとして任意の整数を渡すことができますが、一般的には、ステータスコード0の_System.exit_は正常であり、その他は異常終了です。
これは単なる「良い習慣」であり、コンパイラが気にする厳格な規則ではないことに注意してください。
また、*コマンドラインからJavaプログラムを呼び出す場合、ステータスコードが考慮されることに注意してください。*
次の例では、_SystemExitExample.class、_を実行しようとして、ゼロ以外のステータスコードで_System.exit_を呼び出してJVMを終了すると、次のエコーは出力されません。
java SystemExitExample && echo "I will not be printed"
プログラムが他の標準ツールと通信できるようにするために、関連システムが通信に使用する標準コードに従うことを検討できます。
たとえば、http://tldp.org/LDP/abs/html/exitcodes.html [UNIXステータスコードで定義] 128は「無効な引数の終了」の標準です。 そのため、ステータスコードをオペレーティングシステムに通知する必要がある場合は、このコードを使用することをお勧めします。 それ以外の場合は、コードを自由に選択できます。

7. 結論

このチュートリアルでは、_System.exit_がいつ使用されるか、どのように使用するかについて説明しました。
アプリケーションサーバーやその他の通常のアプリケーションを使用する場合は、https://www.baeldung.com/java-exceptions [例外処理]または​​単純なreturnステートメントを使用してプログラムを終了することをお勧めします。 _System.exit_メソッドの使用法は、スクリプトベースのアプリケーションやステータスコードが解釈される場所に適しています。
この記事で提供されている例を確認することができますhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-jvm[GitHubで]。