web-dev-qa-db-ja.com

main()メソッドのJavaアプリケーション終了コード)はどのように正確に機能しますか?

簡単なコマンドラインJavaアプリケーションに関連して、以下の疑問があります。

したがって、このコマンドラインアプリケーションはMain [クラス内で定義されたmain()メソッドによって開始されます。いつものように、このmain()メソッドはこのシグネチャで定義されています:

_public static void main(String[] args) {
_

戻り値の型はvoidであり、値を返さないことを意味します。しかし、その実行が正常に終了すると、IntelliJコンソールに次のメッセージが表示されます。

_Disconnected from the target VM, address: '127.0.0.1:54090', transport: 'socket'

Process finished with exit code 0
_

_exit code 0_を正確に表すのは何ですか?これは、プログラムがエラーを発生させることなく、実行を正しく完了したことを意味します。

だから今私は次の2つの疑問を持っています:

  1. それが本当である場合、なぜmain()メソッドがvoidを返す場合に発生するのですか?

  2. アプリケーションがエラーで終了した場合、別の終了コードを返すにはどうすればよいですか?

エラーで終了するための標準の終了コード値はありますか?

21
AndreaNobili

VMは、

  • デーモン以外のすべてのスレッドが実行を停止する、または
  • System.exit(exitCode)が呼び出されます

最初のケースでは、終了コードは0です。2番目のケースでは、exit()メソッドに渡される終了コードです。

Main()メソッドが戻ったとしても、デーモン以外のスレッドが実行されなくなるまでプログラムは実行を続けることを忘れないでください。また、VMで実行されているスレッドは、明示的に終了することを選択できます。

終了コード0は、すべてが期待どおりに進んだことを意味します。他の終了コードを使用して、例外的な状態を環境に通知することを選択できます。

27
JB Nizet

プロセスの終了コードは、プロセスがそのエラーコードとしてオペレーティングシステムに報告するものです。

Javaデザイナcouldmain()メソッドがintを返すようにして、JVMがOSにこの値をプロセス終了コードとして報告できるようにします。しかし、彼らはmain voidを作成することに決めましたが、System.exit(exitCode)を使用してこのコードを更新できるAPIを提供しています。このソリューションの利点は、プログラムがメインメソッドとメインスレッドだけでなく、任意の時点とスレッドで終了することを決定できることです。

5
AlexR

終了コード0は、正常に完了したことを意味します。これは、Javaだけでなく、すべてのプロセスの標準です。値はメインメソッド(空)からではなく、JVM自体から返されます。

別の値を指定できます。 System.exit(1)はエラー状態を示し、プログラムが停止します。

4
NickJ