更正Java程序代码片段

时间:2012-04-12 13:04:44

标签: java java.util.scanner

我是初学者,通过回答过往考试试卷上的问题来学习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),所以我会尽量不要在这里贪婪。对于给您带来的任何不便,我深表歉意。

3 个答案:

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

如果cmdnull

,此代码不会抛出NPE

答案 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的内容是否相等。