0

ここで見つけた異常がいくつかあります。

プログラム情報: プログラムはパーサーです。データ入力ストリームを介してデータを取り込みます。次に、データ入力ストリームが閉じられたら、system.exit(0) を呼び出します。

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

jarとexeを作成しました。jarを使用すると、問題なく動作するようです。そして、すべてが期待どおりです。コンソールはこんな感じ

 /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 for で述べられているようにSystem.exit(int status)

public static void exit(int ステータス)

現在実行中の Java 仮想マシンを終了します。引数はステータス コードとして機能します。慣例により、ゼロ以外のステータス コードは異常終了を示します。

このメソッドは、クラス Runtime の exit メソッドを呼び出します。このメソッドが正常に戻ることはありません。

System.exit(n) の呼び出しは、次の呼び出しと事実上同等です。

 Runtime.getRuntime().exit(n)

そのため、別のラッパー ツールを試す価値があるかもしれません。

于 2013-09-06T19:04:23.893 に答える
0

System.exit() は抜本的な呼び出しです。実行中のすべてのスレッドを強制的に終了させます。実行を完了するまで許可するのではありません。終了コードを OS に伝える必要がある場合や、強制終了する必要があることわかっているスレッドがある場合に適しています。ただし、通常は必要ありません。プログラムを終了するためのより良い方法があります。

もちろん、プログラムについて詳しく知らない限り、あなたのことを知ることはできません。しかし、ハック/クイックフィックスはThread.sleep(3000)、exit() の呼び出しの前に右を置くことだと思います。

于 2013-09-06T19:06:00.640 に答える