我正在评估用户输入作为我的应用程序的命令。如果用户按 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");
}
}
答案 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()
的情况下使用现有代码,使用它然后让您的库意外退出新应用程序。
请记住一些事情。码复用。