我正在写一个程序在Java,我需要确保我有正确的错误处理,即我需要遵循Java的标准惯例,让程序退出,要么成功或不成功的状态。
每当我在程序中“捕获”错误时,我都包含了system.exit(1)
。现在我想知道是否也需要在我的程序中提供system.exit(0)
?在这种情况下,我要在程序的哪个位置添加状态为1的出口?
谢谢.
是和不是。
VM将在3种情况下关闭:
>
操作系统告诉它这样做;在posix术语中,因为它接收一个SITERM信号。如果您在一个前台有jvm的终端中按下Ctrl+C,这就是它的工作方式。如果您打开windows的“任务管理器”应用程序,单击它,然后点击“结束进程”,就会发生这种情况。如果在终端中键入kill pidofjavaprocess
,就会发生这种情况。SIGKILLing时的进程返回代码通常是无趣的;通常它是143(128+信号的int值),它在询问你已经知道的信息:是的,它退出是因为你告诉它。你已经知道了。
您可以使用system.exit
命令它这样做。是,按照惯例,返回0表示“成功”,否则返回非零。
VM正在运行的所有线程要么已经死亡,要么已经设置了它们的守护进程标志(使用thread.setdaemon(true)
)。在这种情况下,VM决定没有任何事情可做,并退出,错误代码为0。
当然,如果你强制杀死它(SIGKILL),那么它也会结束,但是它不会运行关机钩子,在Java应用程序中你无法做什么来阻止它。错误代码自然是128+sigkill,这也是一个乏味的问题。
由于规则#3,您不需要编写system.exit(0)
。但是,由于“lets just wait for all threads to exit”的模型倾向于导致应用程序挂起,并且如果没有关闭处理程序(因为系统用户可以Ctrl+C您的应用程序或杀死它),就无法进行“适当的清理”,因此您应该运行system.exit(0)
以减少代码必须处理的路由数量。
那么,你一定要吗?不。你应该吗?是的--因为这是个好主意。
我们正在尝试将一堆Docker版本从Windows 2016更新到Windows 2019,以便我们可以将Service Fabric群集从Windows 2016升级到Windows 2019,并且还可以从。NET Core 2.2的生命周期结束。NET Core 3.1支持LTS。 Windows 2016没有提供.NET Core 3.1的Docker映像,这使得升级更加困难。我们当前的问题
问题内容: 从数据库表和solr中读取数据后,我编写了一个脚本来更新数据库表。我正在使用asyn.waterfall模块。问题在于,成功完成所有操作后,脚本不会退出。我使用过的数据库连接池也认为可能正在创建脚本以无限期等待。我想将此脚本放在crontab中,如果无法正确退出,它将不必要地创建大量实例。 问题答案: 我刚刚经历了这个问题。 仅仅使用的问题是我正在处理的程序正在创建句柄,但从未销毁它们
问题内容: 我试图安装“学者”软件包,但我不断收到此错误: 问题答案: 我有同样的问题。这帮助了我: 如果您使用python3,请尝试将其替换为
问题内容: 我正在尝试使用CentOS安装lxml软件包,并在最后抛出此错误: 错误: 问题答案: 是否安装了gcc?
问题内容: 当我运行以下代码时: 我收到此错误: 退出状态1 但是,这对调试错误的确切原因没有帮助。 如何获得更详细的信息? 问题答案: 解决方案是使用Command对象的属性。可以这样完成: 运行上面的代码,可以清楚地说明问题所在: 退出状态1:查找:-exec:不终止“;” 或“ +” 编辑: 在上面的代码中,我们希望在发生错误的情况下,消息将被打印到stderr,并且命令将返回非零的错误代码
问题内容: 像许多其他工具一样,我在安装python库时遇到问题(下载为tar,然后解压缩)。 如在其他地方建议的那样,我尝试输入终端“ ARCHFLAGS = -Wno-error = unused-command-line-argument- hard-error-in-future sudo python setup.py install”,但没有成功。 有没有办法解决似乎在xcode 5.