以编程方式退出应用程序的适当方法是什么?

时间:2009-11-15 01:18:14

标签: java stdout user-input exit-code

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

6 个答案:

答案 0 :(得分: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)就可以了。

答案 1 :(得分:2)

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

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

  • 有人可能希望稍后将您的代码用于其他目的。

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

答案 2 :(得分:1)

一直回到当然,退出main()是最干净的方式,但如果这不容易做到,System.exit()就完全可以了。< / p>

它与您的问题没有直接关系,但抛出(未处理的)异常通常是终止致命条件的方式,因为它为穷人提供了大量的跟踪信息。 / p>

答案 3 :(得分:0)

我想说:

  

没关系,完全取决于   你!

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

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

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

答案 4 :(得分:0)

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
}

答案 5 :(得分:0)

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

否则,最糟糕的情况是您在不注意System.exit()的情况下使用现有代码,使用它然后让您的库意外退出新应用程序。

请记住一些事情。码复用。