DataInputStream 程序不会在调用 dis.close() 后结束 system.exit(0)。只发生在.exe



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

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

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

我创建了一个罐子和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>

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

公共静态无效退出(整数状态)

终止当前正在运行的 Java 虚拟机。论点 用作状态代码;按照惯例,非零状态代码 表示异常终止。

此方法调用类运行时中的退出方法。此方法从不 正常返回。

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

 Runtime.getRuntime().exit(n)

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

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

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

相关内容

  • 没有找到相关文章

最新更新