0

アプリケーションのコマンドとしてユーザー入力を評価しています。ユーザーが、、Qまたはqを押してからEnterキーを押すと、アプリケーションが終了し、実行が終了します。

適切なコンテキスト、またはそれを行う方法に関するベストプラクティスはありますか?リリースするリソースなどがありません。私はただ使うべき System.exit(0);ですか?それを行うための推奨される方法はありますか?

私の最初のアプローチとして、私は次のようなことをします:

while (true){
    try{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //Other logic goes here...
        if (br.readLine().equalsIgnoreCase("Q")){
            System.exit(0);
        }
    }
    catch (IOException ioe) {
        System.out.println("IO error trying to read your selection");
    }
}
4

6 に答える 6

4

そこに戻ってそこから戻った方がいいでしょうmain()

    private void loop() {
        while (true){
           try{
               BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

               //other logic goes here...
               if(br.readLine().equalsIgnoreCase("Q")){
                   return; // You're done and you are returning to the caller.
               }
           }
           catch (IOException ioe) {
               System.out.println("IO error trying to read your selection");
           }
        }
    }

    public static void main(String[] args) {
        loop();
    }

ただし、リリースするものがない場合は問題ありませんSystem.exit(0)

于 2009-11-15T01:21:23.957 に答える
2

プロセスが終了すると、リソースは OS によって自動的にクリーンアップされます。コードの途中で exit() を実行しない主な理由は 2 つあります (これはすべての言語に当てはまります)。

  • プログラムが終了する前に、いくつかのアクションを実行する必要がある場合があります。たとえば、開いているファイルを保存する必要がある場合があります (つまり、パフォーマンスやその他の理由でまだファイルに送信されていない変更を書き込みます)。

  • 誰かが後であなたのコードを他の目的に使用したいと思うかもしれません。

たとえば、Git バージョン管理システムを考えてみましょう。コードをスタンドアロンの実行可能ファイルのセットではなくライブラリに変換して、他のプロジェクトに効率的に組み込むことができるようにするためのいくつかの取り組みがあります。問題の 1 つ (私が聞いたところによると) は、コードが使用しているリソースを追跡してクリーンアップする代わりに、コードが単純に終了することがあるということです。実行可能ファイルとしては問題ありませんが、ライブラリとしてインポートされた場合は、小さな部分を終えたからといって、ホスト アプリケーションを終了する必要はありません。

于 2009-11-15T01:48:43.040 に答える
1

もちろん、元に戻るのmain()が最もクリーンな方法ですが、それが簡単でない場合System.exit()はまったく問題ありません。

あなたの質問には直接関係ありませんが、(未処理の)例外をスローすることは、通常、致命的な状態で終了する方法です。これは、貧弱なユーザーに多くのトレース情報を提供するためです。

于 2009-11-15T01:37:43.173 に答える
0

System.exit() は問題ありません。そして、私は他の答えに同意します。メンテナンスの観点から、メインに戻ることが終了する最良の方法です。コードが拡張されると、System.exit を実行する小さなメソッドを忘れて、それを記憶するためにデバッグする必要があります。

ただし、異常終了に関する情報が必要なスクリプトがある場合にのみ、 exit を使用する必要があります。そうでなければ必要ありません。

私が思い出したように、Java プログラムはデフォルトで 0 で終了します。これは正常終了を意味します。そのため、何らかのエラーが原因でプログラムが終了した場合に System.exit(n) を使用する必要があります。

例(インスタンス化する可能性が最も高い静的メソッドを使用するだけです...):

public static void main(String[] args) {
   try {
     doStuff();
   } catch (SomeRuntimeException e) {
     // marching orders! Exit with errorcode
     <log the error with sufficient info for debugging>
     System.exit(1);
   }
}

private static doStuff() {
  // doing my thing ...
  ...
  //then some error occurs and I have no other choice but to do a hard exit
  throw new SomeRuntimeException(  ... some info would be nice ...)
  ...
  return
}
于 2009-11-15T01:54:27.007 に答える
0

私は言いたい:

それは問題ではありません、それは完全にあなた次第です!

そして、それが正しい場合もあれば、プログラムの構造とコードの整合性に依存する場合もあります。

合理的な終了はmain、すべてのスレッドを終了するメソッドによるものです。

System.exit は、JVM 内のすべてのスレッドを強制的に終了します。System.exit が正常に戻ることはありません。エラーに使用する必要があります。

于 2009-11-15T01:33:50.590 に答える