2009-10-07 13 views
7

これは愚かですが、何が起こっていますか?なぜ私の文字列比較は機能しませんか?

サーブレット内にパラメータの値をとり、その値に基づいて何かを行うためのテストを行いますが、ifが機能していないString変数があります。何が問題ですか?コンソールで

String action = request.getParameter("action"); 
    System.out.println("Action: " + action); 
// I put 2 ifs to be sure, but not even one is working 
    if(action.equals("something")) 
      { 
       System.out.println("hey");    
      } 
    if(action.trim() == "something") 
      { 
       System.out.println("hey"); 
      } 

、System.out.printlnは、アクションの値は、あなたの第2の比較が間違っている「何か」

Action: something 
+0

何が問題なのですか? 「ちょっと」は一度だけ印刷されていますか?それは2度印刷されると思いますか?あなたのコンソールに "やあ"は表示されませんでしたか? –

+0

彼はかなり具体的です://確かに2つのifを入れますが、1つでも働いていません。 – dpq

+8

「Java」とは呼ばないでください。「Java」です。名前は頭文字ではないので、すべて大文字で書く必要はありません。 – Jesper

答えて

37

であることを私に示しています。

if (action.trim().equals("something")) 

==オペレータが参照(文字列)オブジェクトのと通常の状況下を比較等しい文字列が自動的に同じ参照を持っていない、彼らすなわち:あなたはまた、このように、equals代わりの==を使用する必要があります異なるオブジェクトです。 (両方ともinternalizedではないが、通常は考慮しないでください)

これ以外の例は正常に動作し、最初の比較は有効です。 2番目の比較を修正してみてください。それがうまくいけば、問題が見つかりました。そうでない場合は、デバッガを使用してすべてをダブルチェックしてください。

PS:文字列オブジェクトがnullのときにNullPointerExceptionsがを避けることができる方法

"something".equals(action) 

:動的な文字列オブジェクトリテラル文字列を比較する場合、それは文字列リテラルでequalsメソッドを呼び出すようにするとよいでしょう。

+8

NullPointerExceptionを回避するために、文字列リテラルでequalsを呼び出すための+1。 –

-7

equalsメソッドは、文字列をオブジェクトIDと比較し、内容を比較しません。 2つの文字列の内容を比較するには、compareToメソッドを使用します。

+10

これは間違っています。 'String.equals()'は、文字列を比較し、文字列が等しい場合には 'true'を返します。 – Bombe

0

ただの野生の推測:これらの「もの」の1つには、キリル文字は、そのラテン文字と同じに見えます。この場合、「o」とすることができます。

9

トリミングactionによって作成された文字列オブジェクトが文字列リテラル"something"と同じオブジェクトであるかどうかをテストしています。これは、actionが同じリテラル値に設定されている場合にのみ当てはまります。代わりに"something".equals(action.trim())を使用してください。

最初の条件は、action文字の文字が"something"の文字です。それが真実でないなら、そうではありません。それをテストでアサートし、ログに記録し、プリントしたり、デバッガで調べたりします。

デバッグ用の文字列を印刷する場合は、後ろに空白がある場合は明白になるように、System.out.println ("String = >" + string + "<");などの文字列を使用します。

+0

あなたの答えは優先されるべきであり、それはより正確であり、NPE:を避けることすらできます(理論では、この正確なケースではありません)。ああ、ここには他の人たちもそれに気づくことを期待している。 – Esko

+0

+1 ">"の中に文字列を出力する場合、これは私のstring.matches()をつぶしていた末尾の改行をハイライト表示しました! – shearn89

4

Javaでの文字列比較は、==で行うことはできません。

あなたはString.equals()またはString.compareTo()使用する必要があります - 二つの文字列が等しいとき、ちなみにString.compareTo()戻り0String.equals()に対しリターンtrue

を。

参照: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#equals(java.lang.Object)

+1

あなたの言うことは本当ですが、それが本当であることを説明した方がより役に立ちます。 (すなわち、 'a.equals(b)'は2つの文字列の内容が同じかどうかをテストしますが、aとbが両方とも同じStringオブジェクトを参照している場合にのみ 'a == b'がtrueを返します) –

1

私の推測では、末尾のかのprintlnには表示されません。先頭のスペースを持っていることです。

action.trim() == 'something'を使用していることを確認すると、このテストは機能しません。

これを.equals("something")に変更すると、他の人にも示唆されているように動作します。

+1

'System.out.println(" Action:["+ action + ']');'デバッグのために、末尾のスペースを見ることができます。 –

+0

"System.out.println("アクション:["+ action +"] ");'とする必要があります。私は今朝JavaScriptを書いています:) –

1

文字列リテラルを最初に持つif節を切り替えることで、nullをよりよく保護できます。

しかし、あなたはまた、パラメータ値の空白から保護したいように見えることから、あなたもApache Commons LangからStringUtils.trimToEmptyを使用してパラメータ値のヌル安全なトリムを行うことができます:

String action = StringUtils.trimToEmpty(request.getParameter("action")); 

System.out.println("Action: " + action); 

if("something".equals(action)) { 
    System.out.println("hey");    
} 
0

これを試してみてください。

String action = request.getParameter("action"); 
System.out.println("Action: " + action); 

if(action.trim().equals("something")) 
{ 
    System.out.println("hey");    
} 
関連する問題