line = reader.readline() 结果与文字 "F" 的行为不同
line = reader.readline() result does not behave same as a literal "F"
我试图首先使用 Jeff Langr 的敏捷一书中描述的技术开发命令行界面测试 Java,但我不明白为什么:
行=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"))
认为这会证明它们实际上是不同的,但它的计算结果为 True
并花了几个小时使用我的调试器、Java文档和搜索 Internet。一路上我学到了很多东西,但无法解释正在发生的事情。
如有任何帮助,我们将不胜感激。我确信我遗漏了一些像我这样的新手会遇到的细微差别。谢谢。
好的,看完你的评论,我有一个更好的答案......(第一个完全错误,抱歉):
永远不要通过 ==
比较字符串,因为只有当它是相同的 OBJECT(而不是相同的 STRING)时才会如此。使用 equals()
.
它只适用于常量 "F",因为编译器采用所有常量 "F" 并为它们使用相同的字符串。但是一旦你有一个动态字符串,在运行时来自 "outside",它将是一个完全不同的对象,== 将为 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);
我试图首先使用 Jeff Langr 的敏捷一书中描述的技术开发命令行界面测试 Java,但我不明白为什么:
行=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"))
认为这会证明它们实际上是不同的,但它的计算结果为 True
并花了几个小时使用我的调试器、Java文档和搜索 Internet。一路上我学到了很多东西,但无法解释正在发生的事情。
如有任何帮助,我们将不胜感激。我确信我遗漏了一些像我这样的新手会遇到的细微差别。谢谢。
好的,看完你的评论,我有一个更好的答案......(第一个完全错误,抱歉):
永远不要通过 ==
比较字符串,因为只有当它是相同的 OBJECT(而不是相同的 STRING)时才会如此。使用 equals()
.
它只适用于常量 "F",因为编译器采用所有常量 "F" 并为它们使用相同的字符串。但是一旦你有一个动态字符串,在运行时来自 "outside",它将是一个完全不同的对象,== 将为 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);