1

こんにちは私は最初のJavaアプリを書いていますが、このスクリプトを介してアプリに送信したいテストケース(* .tcファイル)がいくつかあります。

for f in `ls *.tc`; do
  echo "Current Testcase: $f"
  x=${f%.*}
  java Main < $x.tc > $x.out

  if diff "$x.out" "$x.should"; then
    echo "passed testcase $f"
    let PASSED=PASSED+1
  else
    echo "failed testcase $f"
    let FAILED=FAILED+1
 fi
done

tc file問題は、が複数の行を含むとすぐにアプリがおかしくなる理由を完全に理解できないことです。例:quit.tc含む

quit

手動で「quit」と入力したときと同じように機能するため、テストケースは合格です。しかし、私が別のtcを書くときquit2.tc

lala
test
quit

アプリは最初のコマンドの後で終了します(readString関数は後でnullを返すように見えるため)。読み取りを担当する関数は次のとおりです。

public String readString(){

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String answer = null;

try {
  answer = br.readLine();
  return answer;
}
catch(IOException ioe) {
  System.out.println("IO Error");
}
return answer;
}   

アプリにリダイレクトしたときにこの関数がnullを返す理由や時期がわかりませんが、これが問題のようです。tcスクリプトを機能させるために手伝ってもらえますか?どうも

4

2 に答える 2

3

あなたがJavaに不慣れで、それでもあなたのスタイルとやり方を形作るなら、私はあなたに2つの秘訣をお勧めします:

1)スキャナーを使用して入力を読み取ります。ScannerオブジェクトのnextLine()メソッドを使用することは、おそらくあなたが探しているものです。

2) JUnitを介してテストできるように、コードを設計します。

それでも、readString()メソッドでreturn answer;、tryブロックからを削除します。

更新:関数に以下を実装してみてください:

a)スキャナーインスタンスhasNextLine()がtrueの場合->

b)スキャナーインスタンスnextLine()メソッドを呼び出す->

c)行を解析し、「quit」->と等しいかどうかを確認します。

d)対応する論理ifケースを実装します。

于 2011-12-23T16:29:25.573 に答える
0

あなたの問題はBufferedReader:ファイル全体を一度に読み取る(パフォーマンス上の理由から)。

BufferedReaderが呼び出されるたびに新しいリーダーを作成するためreadString()、最初のリーダーはファイルの大部分(またはすべて)を飲み込み、2番目のリーダーはファイルの終わりに到達します。

解決策は、リーダーをフィールドに配置し、一度作成してから、常に同じリーダーを使用して呼び出すことです。readLine()

さらに、リーダーを閉じることはありません。

Javaは未使用のオブジェクトを忘れますが、FileInputStreamsのようなOSリソースを適切に閉じる必要があります

于 2011-12-23T17:01:06.823 に答える