我从批处理文件运行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。
答案 0 :(得分:2)
可能您的代码永远不会显式调用System.exit(someReturnCode)
。
没有显式调用,您最终会在某个时刻出现默认的System.exit(0)
。
设置无关紧要:除非调用该方法,否则RC始终为0!
如评论所暗示,您的 only 希望是通过添加UncaughtExceptionHandler,您可以找到一种方法来通知您的代码有关其他异常的通知的地方。
答案 1 :(得分:1)
解决方案是设置默认的未捕获异常处理程序。这将处理从run()
或main()
传播出去的任何应用程序线程上的任何异常。
参见Thread.setDefaultUncaughtExceptionHandler(...)
的javadocs和
Thread.UncaughtExceptionHandler
界面。
如果您阅读javadocs,将会看到setDefaultUncaughtExceptionHandler
是static
方法。您不会为每个线程都调用它。您只需为所有线程调用一次。
为即将终止的线程传递了Thread
对象的处理程序,如果适合使用非零退出代码调用System.exit
,则可以对其进行编码以进行处理。 。 或不。例如,它根据线程的名称或线程的ThreadGroup或通过检查异常stacktrace以确定哪个类提供了run()
方法来决定这一点。
实际上,当您安装默认的未捕获异常处理程序时,您将替换Java运行时安装的处理程序...,该处理程序将打印堆栈跟踪记录,并(对于main()
线程,将调用{{1 }}。
或者,有一个System.exit(0)
方法在特定线程上设置处理程序。如果需要查找特定线程,则可以通过从根setUncaughtExceptionHandler
遍历线程树来实现。