2009-10-07 110 views
7

好吧,這是愚蠢的,但跆拳道是怎麼回事?爲什麼我的字符串比較不起作用?

我在一個servlet中有一個字符串變量,它接受一個參數的值,並根據該值進行測試,但if不起作用。問題是什麼?

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我行動的價值是「東西」

Action: something 
+0

什麼不起作用?是「嘿」只打印一次,您是否希望打印兩次? 「嘿」沒有出現在您的控制檯上? – 2009-10-07 10:52:51

+0

他是非常具體的:/ /我把2 ifs是肯定的,但甚至沒有一個工作。 – dpq 2009-10-07 10:57:36

+8

請不要稱之爲「JAVA」 - 它是「Java」。這個名字不是一個縮寫,所以你不需要寫全部大寫。 – Jesper 2009-10-07 10:57:48

回答

37

你的第二個比較是錯誤的。您還應該使用equals,而不是==,像這樣:

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

==運算符比較引用(字符串)對象和正常情況下等於字符串不自動具有相同的參考,即它們是不同的對象。 (除非都是internalized,但通常你不應該考慮它)

除此之外,你的例子工作正常,第一次比較是有效的。嘗試修復第二個比較。如果它有效,你發現你的問題。如果沒有,請嘗試使用調試器並仔細檢查一切。

PS:當動態字符串對象比較文字字符串,這是很好的做法,呼籲文字字符串的equals方法:

"something".equals(action) 

這樣就可以避免NullPointerException異常當字符串對象爲null。

+8

用於在字符串文字上調用等於+1以避免NullPointerException。 – 2010-10-27 12:18:09

-7

equals方法比較對象標識的字符串並且不比較內容。要比較兩個字符串的內容,請使用compareTo方法。

+10

這顯然是錯誤的。 String.quals()比較字符串,如果它們相等,則返回「true」 - 就像人們所期望的那樣。 – Bombe 2009-10-07 11:06:54

0

只是一個瘋狂的猜測:可能是這些「事物」之一包含例如一個西里爾字符,看起來與其拉丁字母相同。在這種情況下,它可能是「o」。

9

你的第二個條件不太可能是真的 - 你正在測試修剪action創建的字符串對象是否與字符串字面值"something"相同。這隻有在action在其他地方被設置爲相同的文字值時纔會如此。改爲使用"something".equals(action.trim())

您的第一個條件將是true action字符串中的字符是字符"something"。如果不是這樣,那麼它不會。在測試中聲明它,記錄它,打印它或在調試器中查看它。

如果打印字符串以進行調試,請使用類似System.out.println ("String = >" + string + "<");的內容,以便在存在任何尾隨空格時很明顯。

+0

你的答案應該是首選的,它更正確,甚至可以避免NPE:(理論上,不是在這種情況下)。哦,這是希望其他人也能注意到這一點。 – Esko 2009-10-08 11:40:20

+0

用於在「>」中打印字符串+1,這只是突出顯示了一個尾隨的換行符,它與我的string.matches()混淆! – shearn89 2014-08-12 13:43:26

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

你說的是真的,但如果你解釋_why_這是真的,它會更有幫助。 (即,'a.equals(b)'測試兩個字符串的內容是否相同,但是當a和b都指向相同的String對象時,'a == b'只返回true。) – 2014-09-27 02:13:52

1

我的猜測是,你有尾隨或前導空格不中的println顯示。

將此與您使用action.trim() == 'something'這一事實相結合意味着此測試不起作用。

按照他人的建議切換到.equals("something"),它可能會工作。

+1

我經常做'System.out.println(「Action:[」+ action +']');'用於調試,因爲您可以看到尾部空格。 – 2009-10-07 11:07:24

+0

對不起,應該是'System.out.println(「Action:[」+ action +「]」);'。我今天早上一直在寫JavaScript – 2009-10-07 11:08:22

1

您可以通過切換if子句來使字符串優先,從而更好地防止空值。

但既然你似乎也想防止對參數值的空白,你也可以從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");    
} 
相關問題