3

我是学习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),我将不胜感激。

ps 我知道这不是一个只寻找答案的网站(#noeasywayout),所以我会尽量不要在这里贪婪。对于任何不便,我深表歉意。

4

3 回答 3

8

这个老栗子...

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

使用String.equals()方法来比较它们的

试试这个:

if (cmd.equals("forward"))
    robot.forward(1);
else if (cmd.equals("turn")) 
    robot.turn();
else
    System.out.println("Unknown command: " + cmd);

顺便说一句,使用这种代码模式,如果是,请当心调用.equals()-cmdnull会得到一个NPE。在不添加任何代码的情况下避免这种情况的常用方法是使用“yoda 测试”(具有“反转”逻辑的测试):

if ("forward".equals(cmd))
    robot.forward(1);
else if ("turn".equals(cmd)) 
    robot.turn();
else
    System.out.println("Unknown command: " + cmd);

如果是,此代码不会抛出NPEcmdnull

于 2012-04-12T13:09:23.437 回答
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 是一个对象的原因,当您使用 == 时,它会进行对象比较。

于 2012-04-12T13:08:58.490 回答
2

请参阅Java 语言规范中的此部分:

15.21.3 引用相等运算符 == 和 !=

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

于 2012-04-12T13:13:31.550 回答