在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?
}
}
document说:“这个方法永远不会正常返回。”什么意思?
发布于 2010-09-15 16:45:04
在程序退出之前,可以使用System.exit()
来运行shutdown hooks。这是一种在较大程序中处理关机的便捷方法,在较大的程序中,程序的所有部分都不能(也不应该)知道彼此。然后,如果有人想退出,他可以简单地调用System.exit()
,关闭钩子(如果正确设置)负责执行所有必要的关闭仪式,如关闭文件、释放资源等。
“此方法永远不会正常返回。”意味着该方法不会返回;一旦线程到了那里,它就不会返回。
另一种可能更常见的退出程序的方法是简单地到达main
方法的末尾。但是,如果有任何非守护进程线程正在运行,它们将不会关闭,因此JVM也不会退出。因此,如果您有任何这样的非守护进程线程,则需要一些其他方法(而不是关闭挂钩)来关闭所有非守护进程线程并释放其他资源。如果没有其他非守护进程线程,从main
返回将关闭JVM并调用关闭钩子。
出于某种原因,关机钩子似乎是一种被低估和误解的机制,人们正在用各种专有的自定义黑客重新发明轮子来退出他们的程序。我鼓励使用关闭钩子;它们都在您将使用的标准Runtime中。
发布于 2010-09-15 17:11:14
这个方法永远不会返回,因为它是世界末日,你的任何代码都不会被执行。
在您的示例中,您的应用程序无论如何都会在代码中的同一位置退出,但是,如果您使用System.exit。您可以选择将自定义代码返回到环境中,例如
System.exit(42);
谁将使用您的退出代码?调用应用程序的脚本。适用于Windows、Unix和所有其他可脚本化环境。
为什么要返回代码?“我没有成功”,“数据库没有回答”之类的话。
要了解如何获取退出代码的值并在unix shell脚本或windows cmd脚本中使用它,可以查看this answer on this site。
发布于 2010-09-15 16:50:16
System.exit(0)
会终止JVM。在像这样的简单示例中,很难理解其中的差异。该参数被传递回操作系统,通常用于指示异常终止(例如,某种致命错误),因此,如果您从批处理文件或shell脚本调用java,您将能够获得此值,并了解应用程序是否成功。
如果您在部署到应用程序服务器上的应用程序上调用System.exit(0)
,这将产生相当大的影响(在尝试之前请仔细考虑)。
https://stackoverflow.com/questions/3715967
复制相似问题