【问题标题】:What is an appropriate way to programmatically exit an application?以编程方式退出应用程序的合适方法是什么?
【发布时间】:2009-11-15 01:18:13
【问题描述】:

我正在评估用户输入作为我的应用程序的命令。如果用户按下 Qq,然后按 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");
    }
}

【问题讨论】:

  • System.exit(0); 没有任何问题。但我认为你有更重要的事情要担心,比如正确缩进你的代码。
  • 抱歉,我匆忙复制/粘贴了

标签: java stdout user-input exit-code


【解决方案1】:

您不妨返回到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) 很好。

【讨论】:

  • 是的,System.exit(0) 对你描述的很好。不过,Dmitry 建议返回 main() 是个好主意,以防您将来扩展程序并打开需要发布的内容。
【解决方案2】:

当进程退出时,操作系统会自动清理资源。不只是从代码中间退出有两个主要原因(这适用于所有语言)。

  • 在程序结束之前可能需要采取一些措施。例如,您可能需要保存所有打开的文件(即,由于性能或其他原因尚未将更改写入文件)。

  • 以后可能有人想将您的代码用于其他目的。

以 Git 版本控制系统为例。有几项努力将代码变成一个库而不是一组独立的可执行文件,以便它可以有效地合并到其他项目中。问题之一(据我所知)是代码有时只是简单地终止,而不是跟踪和清理它正在使用的资源。作为一个可执行文件很好,但如果它是作为库导入的,你并不总是想终止宿主应用程序,因为你已经完成了你的小部分。

【讨论】:

    【解决方案3】:

    一路返回main()返回当然是最干净的方式,但如果这不容易做到,System.exit() 完全没问题。

    这与您的问题没有直接关系,但抛出(未处理的)异常通常是在致命情况上终止的方法,因为它为可怜的用户提供了很多跟踪信息。

    【讨论】:

    • 我的例子中的代码在 main.js 中。我认为很难弄清楚“一直返回到 main()”的含义。抱歉,这就是我在上一个答案中要求提供示例的原因。
    • 对不起。除了使用System.exit(),流出 main() 是最干净的方式。
    【解决方案4】:

    我想说:

    没关系,完全取决于 你!

    有时它是正确的,有时它取决于程序结构和代码完整性。

    合理的退出是通过main方法,终止所有线程。

    System.exit 强制终止 JVM 中的所有线程。 System.exit 永远不会正常返回。它应该用于错误。

    【讨论】:

      【解决方案5】:

      System.exit() 很好。我同意其他答案,从维护的角度来看,返回 main 将是最好的退出方式。随着代码的扩展,您可能会忘记执行 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
      }
      

      【讨论】:

        【解决方案6】:

        不要忘记,如果您执行System.exit(),您以后将无法轻松地在独立库中使用您的方法。如果您想在现有解决方案之外重用您的代码(您现在可能不会,但决定在将来这样做),那么您将不得不重新访问并适当地重构。

        否则最坏的情况是您在没有注意到System.exit()s 的情况下使用现有代码,然后在新应用程序中意外退出您的库。

        只是要记住的事情。代码重用。

        【讨论】:

          猜你喜欢
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 2011-10-22
          • 2023-03-29
          • 2011-09-13
          • 2017-12-19
          • 2011-02-18
          • 1970-01-01
          相关资源
          最近更新 更多