更正Java程序代码片段

use*_*780 3 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);
Run Code Online (Sandbox Code Playgroud)

在测试程序时,扫描程序将字符串"forward"读入cmd,但程序输出"Unknown command:forward".

a)详细解释为什么会发生这种情况.

b)应该对代码进行哪些更改以更正此错误.

如果有人可以帮我回答问题a)和b)我将不胜感激.

ps我明白这不是一个只寻找答案的网站(#noeasywayout)所以我会尽量不要在这里贪婪.对于给您带来的任何不便,我深表歉意.

Boh*_*ian 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);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,用这个代码模式,谨防调用.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);
Run Code Online (Sandbox Code Playgroud)

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