2012-04-12 62 views
3

我是一名初級水平的學習java,並通過回答之前考試試卷的問題修改我的考試,並且存在一個我堅持的問題。更正Java程序代碼片段

考慮下面的代碼片段,它讀取輸入命令然後處理它。

String cmd = scanner.next(); 

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

當測試程序中的掃描器在字符串中讀取「前進」進入CMD,但該程序輸出「未知命令:向前」。

a)詳細解釋爲什麼發生這種情況。

B)應該對代碼做了哪些調整來修正這個錯誤。

如果有人能幫助我解答問題一)B)我將不勝感激。

p.s.我明白,這不是一個網站,只是尋找答案(#noeasywayout),所以我會盡我所能不要在這裏貪婪。對於給您帶來的不便,我們深表歉意。

+1

所以你試過的代碼?你有*任何*想法嗎? – 2012-04-12 13:06:43

+1

只是爲了向您指出方向,您無法將'String'與'=='進行比較。你最好自己弄清楚。 – 2012-04-12 13:09:23

回答

8

這老栗子...

在java中,==測試如果兩個操作數是完全相同的對象,這顯然他們不是(的對象之一是一個字符串常量,其他從輸入中讀取)。

使用String.equals()方法來比較它們的

試試這個:

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

BTW,用這個代碼模式,謹防cmd調用.equals()如果是null - 你會得到一個NPE。爲了避免這種不添加任何代碼的一種常見方法是使用「尤達測試」(一用一「反向」邏輯):

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

此代碼將不會引發NPE如果cmdnull

+0

它不是嗎? – hmjd 2012-04-12 13:15:50

+1

@hmjd尤達它*是*,而不是喬達。正確的你! – Bohemian 2012-04-12 13:17:06

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

確定您可以將對象與字符串進行比較。一個字符串也是一個對象。 – 2012-04-12 13:10:34

+1

對不起,我打字的速度很快。我的意思是==用於對象比較而不是字符串比較。 – Namphibian 2012-04-12 13:14:48

+0

固定和時間回家,喝杯咖啡。 – Namphibian 2012-04-12 13:16:11

2

請參閱本節中的Java Language Specification

15.21.3引用相等運算符==和=

雖然==可用於比較參考s的String類型,這樣的相等性測試確定兩個操作數是否引用相同的String對象。如果操作數是不同的String對象,則結果爲false,即使它們包含相同的字符序列。通過方法調用s.equals(t)可以測試兩個字符串s和t的內容是否相等。