我们什么时候应该在Java中调用System.exit。

2022-08-31 06:20:12

在Java中,以下代码中的有或没有有什么区别?System.exit(0)

public class TestExit
{      
    public static void main(String[] args)
    { 
        System.out.println("hello world");

        System.exit(0);  // is it necessary? And when it must be called? 
    }      
}

该文件说:“此方法永远不会正常返回。这是什么意思?


答案 1

System.exit()可用于在程序退出之前运行关闭挂钩。这是在大型程序中处理关闭的便捷方法,其中程序的所有部分都不能(也不应该)相互了解。然后,如果有人想退出,他可以简单地调用,关闭钩子(如果设置正确)负责执行所有必要的关闭仪式,例如关闭文件,释放资源等。System.exit()

“此方法永远不会正常返回”,只是意味着该方法不会返回;一旦线程到达那里,它就不会回来。

退出程序的另一种,也许更常见的方法是简单地到达方法的末尾。但是,如果有任何非守护进程线程正在运行,它们将不会被关闭,因此 JVM 不会退出。因此,如果您有任何此类非守护程序线程,则需要一些其他方法(除了关闭钩子)来关闭所有非守护程序线程并释放其他资源。如果没有其他非守护进程线程,则返回将关闭 JVM 并调用关闭钩子。mainmain

由于某种原因,关闭钩子似乎是一种被低估和误解的机制,人们正在用各种专有的自定义黑客来重新发明轮子,以退出他们的程序。我鼓励使用关机钩子;它全部存在于您无论如何都将使用的标准运行时中。


答案 2

在这种情况下,不需要它。不会启动额外的线程,您不会更改退出代码(默认为0) - 基本上这是毫无意义的。

当文档说该方法永远不会正常返回时,这意味着后续代码行实际上无法访问,即使编译器不知道:

System.exit(0);
System.out.println("This line will never be reached");

要么引发异常,要么 VM 在返回之前终止。它永远不会“只是回来”。

很少值得调用 IME。如果您正在编写命令行工具,并且希望通过退出代码指示错误,而不仅仅是抛出异常,那么这可能是有意义的...但我不记得我上一次在正常的生产代码中使用它。System.exit()


推荐