我首先尝试使用Jeff Langr的书Agile Java中描述的技术开发命令行界面测试,但我无法弄清楚原因:
line = reader.readline();结果与文字的行为不相同" F"在我的代码中。
这可行...漫游者前进到1:
private void goForward() {
rover.move("F");
}
这不起作用......流动站保持在0:
private void goForward() throws IOException {
StringBuffer input = new StringBuffer();
input.append(line("F"));
byte[] buffer = input.toString().getBytes();
InputStream inputStream = new ByteArrayInputStream(buffer);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
rover.move(line);
}
private String line(String str) {
return String.format("%s%n", str);
}
我已经做了我能想到的一切:
我添加了几个
System.out.println(line);
查看前后行的值,一切看起来都没问题。
但看起来可能是骗人的所以我添加了一个
if(line.equals("F"))
认为这会证明它们实际上是不同的,但它的评估结果为真
花了几个小时与我的调试器,Javadocs和搜索互联网。我一路上学到了很多,但没有任何东西可以解释发生的事情。
非常感谢任何帮助。我相信我错过了一些困扰像我这样的新手的细微差别。感谢。
答案 0 :(得分:1)
好的,在看完你的评论后,我有一个更好的答案......(第一个是完全错误的,对不起):
字符串永远不应该通过==
进行比较,因为只有当它是相同的OBJECT(并且不是相同的STRING)时才会出现这种情况。使用equals()
。
它只适用于常量“F”,因为编译器获取所有常量“F”并为它们使用相同的String。但是只要你有一个动态字符串,在运行时来自“外部”,它将是一个完全不同的对象,其中==将为FALSE,而equals将为TRUE。
String x = "F";
// Might be true, because the compiler will use ONE object
// for both instances of "F". It's still bad and should not be done.
boolean isF = x == "F";
String y = new Scanner(System.in).nextLine();
// Will NEVER be true, even if you entered "F", because
// y will always be a NEW String object...
isF = y == "F";
// Will be true, if you entered "F"
isF = "F".equals(y);