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 これは単に答えを探すための Web サイト (#noeasywayout) ではないことを理解しています。ご不便をおかけして申し訳ございません。

4

3 に答える 3

8

この古い栗...

Java では、2 つのオペランドがまったく同じ object==であるかどうかをテストしますが、明らかにそうではありません (オブジェクトの 1 つは String 定数であり、もう 1 つは入力から読み取られたものです)。

メソッドを使用して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ください。コードを追加せずにこれを回避する一般的な方法は、"yoda テスト" ("逆" のロジックを持つテスト) を使用することです。

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

次の場合、このコードは NPE をスローしませんcmdnull

于 2012-04-12T13:09:23.437 に答える
2

Java言語仕様のこのセクションを参照してください。

15.21.3参照等式演算子==および!=

==はString型の参照を比較するために使用できますが、このような等価性テストでは、2つのオペランドが同じStringオブジェクトを参照しているかどうかを判断します。オペランドに同じ文字シーケンスが含まれている場合でも、オペランドが別個のStringオブジェクトである場合、結果はfalseになります。2つの文字列sとtの内容は、メソッド呼び出しs.equals(t)によって等しいかどうかをテストできます。

于 2012-04-12T13:13:31.550 に答える
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 に答える