プログラム内からJavaアプリを終了する方法


145

コードでJavaアプリケーションを終了する最良の方法は何ですか?


1
うーん。質問は一般的すぎるかもしれません。どのような状況で終了しますか?
アレンジョージ

3
デーモン以外のスレッドをすべて正常に終了させますか?
–ThorbjørnRavn Andersen 2010

回答:


192

使用できます System.exit()この目的に。

オラクルのJava 8ドキュメントによると:

public static void exit(int status)

現在実行中のJava仮想マシンを終了します。引数はステータスコードとして機能します。慣例により、ゼロ以外のステータスコードは異常終了を示します。

このメソッドは、ランタイムクラスのexitメソッドを呼び出します。このメソッドは通常は戻りません。

呼び出しSystem.exit(n)は実質的に呼び出しと同等です:

Runtime.getRuntime().exit(n)


102
System.exit(0);

「0」は、プログラムを呼び出した人に、すべてがうまくいったことを知らせます。ただし、エラーのために終了する場合は、System.exit(1);、特定のエラーに対応する、またはゼロ以外の数値を使用して終了する必要があります。

また、他の人が述べたように、最初にクリーンアップしてください!これには、ファイルやその他の開いているリソースを閉じることが含まれます。


System.exit(1)だと思いましたか?
AFKは2010

14
Chrisが述べているようにSystem.exit(1)(またはその他の数値)は、エラーが原因でクローズしたことを示したい場合です。System.exit(0)プログラムが正常に終了したことを示します。1を任意の数に変更することもできます。その後、スクリプトからアプリケーションを実行しているときに、エラーが発生したかどうかを判断できます。
StormPooper

10

System.exit(int i)を使用する予定shutdown()ですが、「クリーンアップ」手順も含めて、ソケット接続を閉じ、ファイル記述子を指定してからで終了する、より一般的なメソッド内に含めますSystem.exit(x)


6

System.exit() 通常は最善の方法ではありませんが、アプリケーションによって異なります。

アプリケーションを終了する通常の方法は、main()メソッドを終了することです。これは、グラフィカルユーザーインターフェイス(AWT、Swingなど)を備えたアプリケーションで通常行われているように、デーモン以外のスレッドが実行されている場合には機能しません。これらのアプリケーションの場合、GUIイベントループを終了する方法を見つける(AWTまたはSwingでそれが可能かどうかわからない)か、を呼び出すSystem.exit()


4

を使用することdispose();は、プログラムを閉じるための非常に効果的な方法です。

を使用System.exit(x)するとインタラクションペインがリセットされ、そこにいくつかの情報が必要だとすると、すべてが消えてしまうことがわかりました。


3

私はジョンに同意し、アプリケーションが何かに反応してSystem.exit()を呼び出すようにします。

次のことを確認してください。

  • 適切な終了値を使用します。0は正常終了、それ以外はエラーがあったことを示します
  • すべての入力および出力ストリームを閉じます。ファイル、ネットワーク接続など
  • 特にエラーが原因の場合は、終了の理由をログに記録または出力します

2

答えはSystem.exit()ですが、これによりプログラムが中止されるため、実行することはお勧めできません。クリーンアップ、破棄するつもりはありません。


1

質問には2つの簡単な答えがあります。

これが「プロフェッショナルな方法」です。

//This just terminates the program.
System.exit(0);

これはもっと不格好な方法です:

//This just terminates the program, just like System.exit(0).
return;

System.exit(0); return;また、システムが終了する前に他のコードが実行されるのを防ぐために、リターンが返されます。それ以外の場合は、フラグが必要です(..i.e. if (!called_exit) { further code after exit statement }
ycomp

-1
Runtime.getCurrentRumtime().halt(0);

1
より良い:Runtime.getRuntime()。halt(0); Scala内で完全に機能しました!
ゲルハルトハゲラー2013年

@GerhardHagererしかし、もしあなたが現在ではないruntiを取得したらどうなるでしょうか?
Dude Bro 2013年

1
Javadocからhalt:「このメソッドは細心の注意を払って使用する必要があります。exitメソッドとは異なり、このメソッドはシャットダウンフックを開始せず、終了時のファイナライズが有効になっている場合、呼び出されていないファイナライザを実行しません。シャットダウンシーケンスがすでに開始されている場合、このメソッドは実行中のシャットダウンフックまたはファイナライザが作業を完了するのを待ちません。」要するに、あなたは使用する必要はありませんhalt、あなたが好むはずですexit
Erwin Bolwidt 2017年

-1

System.exit()あなたがしたいことをします。ただし、ほとんどの場合、スレッドを終了し、メインスレッドはそのままにしておきます。そうすることで、タスクを終了できますが、アプリを再起動せずに別のタスクを開始する機能も維持できます。



-3

これは正しい方法で行う必要があります:

mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
mainFrame.addWindowListener(new WindowListener() {

@Override
public void windowClosing(WindowEvent e) {
    if (doQuestion("Really want to exit?")) {
      mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mainFrame.dispose();
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.