为什么java.exe在RuntimeException上不返回错误代码?

时间:2019-02-08 13:35:16

标签: java

我从批处理文件运行java.exe,而我的Java应用程序(这是一个LibGDX应用程序,顺便说一句)总是返回0作为返回码(到命令提示符),即使应用程序崩溃了

我的问题是:为什么Java不返回某种错误代码(例如错误代码1),并且有可能以某种方式告诉Java在例如上面返回错误代码? RuntimeException

我的问题是这个:在我的批处理文件中,我有以下代码:

IF %ERRORLEVEL% NEQ 0 ( 
   @echo on
   echo Batch execution finished with error: %errorlevel%
   pause
)

但是,此代码永远不会执行,因此,当应用程序完成时,我的命令提示符将关闭。但是,如果应用程序崩溃,我希望它保持打开状态,以便我可以分析错误。

请注意,我无法在System.exit(1)上随意调用RuntimeException,因为我的应用程序使用LibGDX,该LibGDX在我无法控制的单独线程中运行。换句话说,我无法在我的main()方法中捕获从该线程抛出的RuntimeException。

2 个答案:

答案 0 :(得分:2)

可能您的代码永远不会显式调用System.exit(someReturnCode)

没有显式调用,您最终会在某个时刻出现默认的System.exit(0)

设置无关紧要:除非调用该方法,否则RC始终为0!

如评论所暗示,您的 only 希望是通过添加UncaughtExceptionHandler,您可以找到一种方法来通知您的代码有关其他异常的通知的地方。

答案 1 :(得分:1)

解决方案是设置默认的未捕获异常处理程序。这将处理从run()main()传播出去的任何应用程序线程上的任何异常。

参见Thread.setDefaultUncaughtExceptionHandler(...)的javadocs和 Thread.UncaughtExceptionHandler界面。

如果您阅读javadocs,将会看到setDefaultUncaughtExceptionHandlerstatic方法。您不会为每个线程都调用它。您只需为所有线程调用一次。

为即将终止的线程传递了Thread对象的处理程序,如果适合使用非零退出代码调用System.exit,则可以对其进行编码以进行处理。 。 或不。例如,它根据线程的名称或线程的ThreadGroup或通过检查异常stacktrace以确定哪个类提供了run()方法来决定这一点。

实际上,当您安装默认的未捕获异常处理程序时,您将替换Java运行时安装的处理程序...,该处理程序将打印堆栈跟踪记录,并(对于main()线程,将调用{{1 }}。

或者,有一个System.exit(0)方法在特定线程上设置处理程序。如果需要查找特定线程,则可以通过从根setUncaughtExceptionHandler遍历线程树来实现。