0

我在这里发现了一些异常情况。

程序信息:该程序是一个解析器。它通过数据输入流接收数据。然后当数据输入流关闭时,我调用 system.exit(0)。

 dis.close();
 System.exit(0);

我创建了一个 jar 和 exe。当我使用罐子时,它似乎运行良好。一切都如预期的那样。控制台看起来像这样

 /the/path/that/im/currently/in
 $      <I type:>    java -jar myprogram.jar commandLineArg     *enter
                     Program output
                     Program output
                     Program output
 <program ends and goes back to>
 /the/path/that/im/currently/in
 $

当我使用 exe。控制台看起来像这样,你可以看到它是如何反弹的。

 /the/path/that/im/currently/in
 $     <I type:>    ./myprogram commandLineArg       *enter
 /the/path/that/im/currently/in
 $                  Program output
                    Program output
                    Program output
 <now stuck hanging until I hit enter or ctrl+c>     *enter

 /the/path/that/im/currently/in
 $ <now i'm back where I should be>
4

2 回答 2

0

这听起来像是您用来制作.exe文件的工具的问题,它可能不再使用 Java 虚拟机来执行您的代码,或者使用不恰当地实现的代码,因为System.exit(0)调用未被识别为命令也退出包装过程,如 Javadocs 所述System.exit(int status)

公共静态无效退出(int状态)

终止当前运行的 Java 虚拟机。该参数用作状态码;按照惯例,非零状态码表示异常终止。

该方法调用 Runtime 类中的 exit 方法。此方法永远不会正常返回。

调用 System.exit(n) 实际上等效于调用:

 Runtime.getRuntime().exit(n)

因此,可能值得尝试另一个包装工具。

于 2013-09-06T19:04:23.893 回答
0

System.exit() 是一个激烈的调用——它强制所有正在运行的线程退出,而不是让它们运行完成。在您需要将退出代码传达给操作系统的情况下,或者当您知道应该杀死线程时,它可能是合适的。但这通常不是必需的,有更好的方法来终止您的程序。

当然,除非我们对该计划有更多了解,否则我们无法说出您的情况。但我怀疑一个黑客/快速修复将是Thread.sleep(3000)在调用exit()之前放置一个权利。

于 2013-09-06T19:06:00.640 回答