1. 概要

このチュートリアルでは、System.exitがJavaで何を意味するかを見ていきます。

その目的、使用場所、使用方法を見ていきます。 また、さまざまなステータスコードで呼び出すことの違いについても説明します。

2. System.exit とは何ですか?

System.exitvoidメソッドです。 終了コードを受け取り、それを呼び出し元のスクリプトまたはプログラムに渡します。

zeroのコードで終了することは、通常の終了を意味します:

System.exit(0);

メソッドへの引数として任意の整数を渡すことができます。 ゼロ以外のステータスコードは異常終了と見なされます。

System.exit メソッドを呼び出すと、現在実行中のJVMが終了し、プログラムが終了します。 このメソッドは正常に戻りません。

これは、System.exitの後の後続のコードが事実上到達不能であるにもかかわらず、コンパイラーがそれを認識していないことを意味します。

System.exit(0);
System.out.println("This line is unreachable");

System.exit(0)を使用してプログラムをシャットダウンすることはお勧めできません。 それは私たちに終了するのと同じ結果を与えます主要メソッドを実行し、後続の行の実行を停止します。 また、System.exitを呼び出すスレッドは、JVMが終了するまでブロックします。 シャットダウンフックがこのスレッドにタスクを送信すると、デッドロックが発生します。

3. なぜそれが必要なのですか?

System.exit の一般的な使用例は、異常な状態があり、プログラムをすぐに終了する必要がある場合です。

また、メインメソッド以外の場所からプログラムを終了する必要がある場合は、System.exitがその方法の1つです。

4. いつ必要ですか?

スクリプトは、呼び出すコマンドの終了コードに依存するのが一般的です。 このようなコマンドがJavaアプリケーションの場合、System.exitはこの終了コードを送信するのに便利です。

たとえば、例外をスローする代わりに、呼び出し元のスクリプトで解釈できる異常な終了コードを返すことができます。

または、 System.exit を使用して、登録したシャットダウンフックを呼び出すことができます。 これらのフックは、保持されているリソースをクリーンアップし、他の非デーモンスレッドから安全に終了するように設定できます。

5. 簡単な例

この例では、ファイルを読み取ろうとし、ファイルが存在する場合は、そこから1行を出力します。 ファイルが存在しない場合は、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を終了し、最終的にブロックの実行を許可しないためです。

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

ステータスコードとして任意の整数を渡すことができますが、一般的な方法では、ステータスコード0の System.exit は正常であり、その他は異常な出口です。

これは単なる「グッドプラクティス」であり、コンパイラが気にする厳密なルールではないことに注意してください。

また、コマンドラインからJavaプログラムを呼び出すと、ステータスコードが考慮されることに注意してください。

以下の例では、 SystemExitExample.classを実行しようとすると、 System.exit をゼロ以外のステータスコードで呼び出してJVMを終了すると、次のエコーが実行されます。印刷されません。

java SystemExitExample && echo "I will not be printed"

プログラムが他の標準ツールと通信できるようにするために、関連するシステムが通信に使用する標準コードに従うことを検討する場合があります。

特別な意味を持つ終了コードLinuxDocumentation Projectによって作成されたドキュメントには、予約済みコードのリストが表示されます。  また、特定のシナリオで使用するコードについてもアドバイスします。

7. 結論

このチュートリアルでは、 System.exit がいつ使用されるか、およびその使用方法について説明しました。

アプリケーションサーバーやその他の通常のアプリケーションを操作する場合は、例外処理またはプレーンなreturnステートメントを使用してプログラムを終了することをお勧めします。 System.exit メソッドの使用は、スクリプトベースのアプリケーションまたはステータスコードが解釈される場所に適しています。

この記事で提供されている例をGitHubで確認できます。