line = reader.readline()结果与文字“F”的行为不同

时间:2015-03-21 19:37:14

标签: java bufferedreader

我首先尝试使用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和搜索互联网。我一路上学到了很多,但没有任何东西可以解释发生的事情。

非常感谢任何帮助。我相信我错过了一些困扰像我这样的新手的细微差别。感谢。

1 个答案:

答案 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);