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

并且就像我手动输入“退出”时一样工作,然后测试用例通过。但是,当我写另一个 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() 为真时 ->

b)调用扫描仪实例 nextLine() 方法 ->

c)解析该行,看看它是否等于 'quit' ->

d)执行相应的逻辑if案例。

于 2011-12-23T16:29:25.573 回答
0

您的问题是BufferedReader:它将一次读取整个文件(出于性能原因)。

BufferedReader由于您每次创建一个新readString()的被调用,第一个阅读器将吞下大部分文件(或全部),第二个阅读器将到达文件结尾。

解决方案是将阅读器放入一个字段中,创建一次,然后始终使用同一个阅读器调用readLine()

另外,您永远不会关闭阅读器。

Java 会忘记未使用的对象,但您必须正确关闭操作系统资源,例如FileInputStreams

于 2011-12-23T17:01:06.823 回答