0

次のシナリオでは、PHP スクリプトが Java アプリケーション内からプロセスとして実行されているコンソール アプリケーションを扱っています。スクリプトに 2 つの値が入力されるたびに、"OK" または "ERR" のいずれかが返されます。入力がスクリプトに入力されてからの所要時間と、「OK」または「ERR」値で返される時間をキャプチャしようとしています。

次の修正を実装しましたが、まだ機能していないようです。誰かが光を当てることができれば。

try {
        proc = runtime.exec("php " + "script.php");            


        inp = new BufferedReader( new InputStreamReader(proc.getInputStream()) );
        out = new BufferedWriter( new OutputStreamWriter(proc.getOutputStream()) );

        while (true) {
            temp = getRandomUser() + " " + getRandomHost();
            startTime = System.currentTimeMillis();
            //System.out.println(temp);

            print(pipe(temp));

            while (!inp.readLine().equals("ERR") || !inp.readLine().equals("OK")) {
            }

            endTime = System.currentTimeMillis();
            procTime = (long) endTime - startTime;

            fout.write(Double.toString(procTime));
            fout.newLine();
            //System.out.println("! " + procTime);
        }


} catch (IOException ex) {
        System.out.println("Thread prematurely Terminated...");
} 
4

1 に答える 1

1

症状の説明が不明確です。ただし、これはほぼ間違いなく間違っています。

while (!inp.readLine().equals("ERR") || !inp.readLine().equals("OK")) {
}

まず、ストリームの最後に到達すると、readLineはを返しnull、それを呼び出そうとするとNPEを取得しますequals

次に、条件は実際にはreadLine()2回呼び出しています。「ERR」または「OK」に一致する行を取得するまで、行を読み取って破棄することを意図しているようです。しかし、コードはそれを行いません。実際、最初に読み取った重要な行が「OK」の場合、条件は発生しません...そしてあなたは読み続けようとします。コードは次のようになります。

String line = inp.readLine();
while (line != null && !line.equals("ERR") && !line.equals("OK")) {
    line = inp.readLine();
}

このバグは、コードがブロックする理由を説明するのに確かに十分です...

于 2012-12-03T03:04:25.347 に答える