更正Java程序代码片段

更正Java程序代码片段,java,java.util.scanner,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);

我是一个学习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”。

String cmd = scanner.next();

if (cmd == "forward" )
    robot.forward(1);
else if (cmd == "turn" ) 
    robot.turn();
else
     System.out.println("Unknown command: " + cmd);
a)详细解释发生这种情况的原因。

String cmd = scanner.next();

if (cmd == "forward" )
    robot.forward(1);
else if (cmd == "turn" ) 
    robot.turn();
else
     System.out.println("Unknown command: " + cmd);
b)应对代码进行哪些更改以更正此错误。

String cmd = scanner.next();

if (cmd == "forward" )
    robot.forward(1);
else if (cmd == "turn" ) 
    robot.turn();
else
     System.out.println("Unknown command: " + cmd);
如果有人能帮我回答问题a)b)我将不胜感激


p、 我知道这不是一个只寻找答案的网站(noeasywayout),所以我会尽我所能不要在这里表现得贪婪。不便之处,敬请原谅。

请尝试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);
原因是字符串是一个对象,当您使用==时,它会进行对象比较。

这个旧的字符串

在java中,
==
测试两个操作数是否是完全相同的对象,显然不是(其中一个对象是字符串常量,另一个是从输入读取的)

使用方法比较它们的值

试试这个:

if (cmd.equals("forward"))
    robot.forward(1);
else if (cmd.equals("turn")) 
    robot.turn();
else
    System.out.println("Unknown command: " + cmd);
顺便说一句,使用这种代码模式,注意在
cmd
上调用
.equals()。在不添加任何代码的情况下避免这种情况的常见方法是使用“yoda测试”(具有“反向”逻辑的测试):


此代码不会抛出if
cmd
null

请参阅:

15.21.3参考等式运算符==和=

虽然==可用于比较String类型的引用,但这种相等性测试确定两个操作数是否引用同一个String对象。如果操作数是不同的字符串对象,即使它们包含相同的字符序列,结果也为false。可以通过方法调用s.equals(t)来测试两个字符串s和t的内容是否相等


你试过密码了吗?你有什么想法吗?只是为了给你指明方向,你不能将
字符串
s与
==
进行比较。你最好自己去弄清楚。当然你可以把一个对象和一个字符串进行比较。字符串也是一个对象。是的,对不起,我打字太快了。我的意思是==用于对象比较,而不是字符串比较。已修复,该回家喝杯咖啡了。@hmjd Yoda是,不是joda。没错!