2012-05-02 8 views
0

私はこのコードを使用する場合:java.util.Scannerを使ってforループを壊すことができないのはなぜですか?

Scanner scan = new Scanner(System.in); 
String codeEntered = ""; 
for (; ;){ 
     System.out.print("Enter Code or Press Q to Quit:\n"); 
     codeEntered = scan.nextLine(); 
     if (codeEntered == "Q"){ 
      break; 
     } 
     //Do stuff here. 

} 
System.out.println("Goodbye!"); 

を私は「Q」と入力しても、forループから抜け出すことはできません。このコードで何が問題になっていますか?

答えて

8
if (codeEntered == "Q"){ 

オブジェクトを比較するときは、通常equals()なくoperator==を使用する必要があります。 (とStringはオブジェクトである!)アイデンティティため
operator==チェック - 2つのオペランドが同じオブジェクトであれば、その内容お互いに等しいequals()チェックするとしています。

試してみてください。

if ("Q".equals(codeEntered)){ 
+0

この古い栗... – Bohemian

+0

完璧な答え!私はこれを理解しなかった。私はいつも==とfoo.equals( "")の違いを疑問に思っています。ありがとう! – Cin316

3

==を使用して文字列を比較しないでください。代わりにequals(...)またはequalsIgnoreCase(...)メソッドを使用してください。あなたが興味を持っていない2つののオブジェクトが同じであるかどうかをチェックすることを理解しています。しかし、2つのStringが同じ文字を同じ順序で持つかどうかをチェックします。だからではなく、

if (fu == "bar") { 
    // do something 
} 

行い、

if ("bar".equals(fu)) { 
    // do something 
} 

か、の

if ("bar".equalsIgnoreCase(fu)) { 
    // do something 
} 
2

あなたの問題は、文字列を比較するために二重の等号==を使用していることです。

が、これは代わりに

if(codeEntered.equals("Q")) { 
    break; 
} 

==は、文字列に対して同じになることはありませんメモリ内のアドレスを、比較してみます。 Javaで文字列を比較するときは常に.equalsを使用するべきです。

2

equals()メソッドを使用してください。

if (codeEntered.equals("Q")){ 
     break; 
} 

equals()メソッドは、Stringオブジェクト内の文字を比較します。 ==演算子は、2つのオブジェクト参照が同じインスタンスを参照しているかどうかを比較します。例えば

、この場合

String hello = new String("hello"); 

helloは、(intern参照)プールされたインスタンスを1つ作成し、そしてnew String(...)非プールされたインスタンスを作成します。

System.out.println(("hello" == "hello") + "," + (new String("hello") == "hello") + "," + (new String("hello") == new String("hello")));

を試してみては

は本当に何も有効ではありません(上記の例のように)true,false,false


new String("hello");が表示されるはずです。これは、sと同じ配列、オフセット、および長さを持つ別のインスタンスを作成するだけです。これを行う理由は非常にまれであるため、ほとんどのJavaプログラマは悪い習慣とみなされます。

2

オブジェクトは、equalsメソッドと==のプリミティブを使用して常に比較する必要があります。カスタムオブジェクトは、オブジェクトの等価性をチェックする独自のequalsメソッドを実装する必要があります。これがサムルールです。

関連する問題