0

我正在评估用户输入作为我的应用程序的命令。如果用户按下Q、 或q,然后按回车键,则应用程序退出并终止执行。

是否有适当的背景或如何做到这一点的最佳实践?我没有任何资源可以释放,或者类似的东西。我应该使用 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

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

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

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

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

于 2009-11-15T01:48:43.040 回答
1

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

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

于 2009-11-15T01:37:43.173 回答
0

我想说:

没关系,这完全取决于你!

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

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

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

于 2009-11-15T01:33:50.590 回答
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
}
于 2009-11-15T01:54:27.007 回答
0

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

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

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

于 2009-11-15T14:06:49.537 回答