[英]Why doesn't my string comparison work?
好的,這很愚蠢,但是wtf還在繼續嗎?
我在Servlet中有一個String變量,它接受參數的值,並基於該值進行測試以執行某些操作,但是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
您的第二個比較是錯誤的。 您還應該使用equals
代替==
,如下所示:
if (action.trim().equals("something"))
==
運算符比較(String)對象的引用 ,在正常情況下, 相等的字符串不會自動具有相同的引用,即它們是不同的對象。 (除非兩者都已內部化 ,但通常不應該考慮)
除此之外,您的示例可以正常工作,並且第一個比較有效。 嘗試修復第二個比較。 如果可行,您發現了問題。 如果不是,請嘗試使用調試器並仔細檢查所有內容。
PS:比較文字字符串和動態字符串對象時,最好對文字字符串調用equals
方法:
"something".equals(action)
這樣,當字符串對象為null時,可以避免NullPointerExceptions。
您的第二個條件不可能像現在這樣-您正在測試通過trimming action
創建的字符串對象是否與字符串文字"something"
。 僅當在其他位置將action
設置為相同的文字值時,才為true。 請改用"something".equals( action.trim() )
。
您的第一個條件是正確的, action
字符串中的字符是字符"something"
。 如果不是真的,那就不是。 將其聲明為測試,記錄,打印或在調試器中查看。
如果打印字符串進行調試,請使用類似System.out.println ( "String = >" + string + "<" );
因此很明顯是否有尾隨空格。
Java中的字符串比較不能通過==
完成。
您必須使用String.equals()
或String.compareTo()
-
順便說一句,當兩個字符串相等時, String.compareTo()
返回0
而String.equals()
返回true
。
參見: http : //java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#equals(java.lang.Object)
我的猜測是您有在println中不顯示的尾隨或前導空格。
將此與您正在使用action.trim() == 'something'
的事實結合起來,意味着此測試也將無法進行。
按照其他人的建議將.equals("something")
切換為.equals("something")
,它可能會起作用。
通過將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");
}
只是一個瘋狂的猜測:可能是這些“內容”之一包含西里爾字母,看起來與拉丁字母相同。 在這種情況下,它可能是“ o”。
嘗試這個 :
String action = request.getParameter("action");
System.out.println("Action: " + action);
if(action.trim().equals("something"))
{
System.out.println("hey");
}
equals方法比較字符串以獲取對象標識,而不比較內容。 要比較兩個字符串的內容,請使用compareTo方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.