我是初学者,通过回答过往考试试卷上的问题来学习java并修改考试,并且有一个问题我会坚持下去。
考虑下面的代码片段,它读取输入命令然后处理它。
String cmd = scanner.next();
if (cmd == "forward" )
robot.forward(1);
else if (cmd == "turn" )
robot.turn();
else
System.out.println("Unknown command: " + cmd);
在测试程序时,扫描程序将字符串“forward”读入cmd,但程序输出“Unknown command:forward”。
a)详细解释为什么会发生这种情况。
b)应对代码进行哪些更改以纠正此错误。
如果有人可以帮我回答问题 a)和 b),我将不胜感激。
P.S。我知道这不是一个只寻找答案的网站(#noeasywayout),所以我会尽量不要在这里贪婪。对于给您带来的任何不便,我深表歉意。
答案 0 :(得分:8)
这个老栗子......
在java中,==
测试两个操作数是否是完全相同的对象,显然它们不是(其中一个对象是一个String常量,另一个是从输入读取的) )。
使用String.equals()
方法比较值。
试试这个:
if (cmd.equals("forward"))
robot.forward(1);
else if (cmd.equals("turn"))
robot.turn();
else
System.out.println("Unknown command: " + cmd);
BTW,使用这种代码模式,请注意.equals()
上的cmd
,如果它是null
,您将获得NPE。在不添加任何代码的情况下避免这种情况的常用方法是使用“yoda测试”(具有“反向”逻辑的测试):
if ("forward".equals(cmd))
robot.forward(1);
else if ("turn".equals(cmd))
robot.turn();
else
System.out.println("Unknown command: " + cmd);
如果cmd
为null
答案 1 :(得分:2)
尝试cmd.equalsIgnorecase或cmd.equals而不是==。
String cmd = scanner.next();
if (cmd.equals("forward") )
robot.forward(1);
else if (cmd.equals("turn") )
robot.turn();
else
System.out.println("Unknown command: " + cmd);
String的原因是一个对象,当你使用==时它会进行对象比较。
答案 2 :(得分:2)
请参阅Java Language Specification:
中的此部分15.21.3参考等式运算符==和!=
虽然==可用于比较String类型的引用,但这样的相等性测试确定两个操作数是否引用相同的String对象。如果操作数是不同的String对象,则结果为false,即使它们包含相同的字符序列。可以通过方法调用s.equals(t)测试两个字符串s和t的内容是否相等。