为什么我的字符串比较不起作用?

时间:2009-10-07 10:49:55

标签: java

好的,这是愚蠢的,但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

8 个答案:

答案 0 :(得分:37)

你的第二次比较是错误的。您还应该使用equals代替==,如下所示:

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

==运算符比较(String)对象的引用,并且在正常情况下相等字符串不会自动具有相同的引用,即它们是不同的对象。 (除非两者都是internalized,但通常你不应该考虑它)

除此之外,您的示例工作正常,第一次比较有效。尝试修复第二次比较。如果它有效,你就找到了问题所在。如果没有,请尝试使用调试器并仔细检查所有内容。

PS:将文字字符串与动态字符串对象进行比较时,最好在文字字符串上调用equals方法:

"something".equals(action)

这样,当字符串对象为空时,可以避免NullPointerExceptions。

答案 1 :(得分:9)

你的第二个条件不太可能是真的 - 你正在测试修剪action创建的字符串对象是否与字符串文字"something"是同一个对象。仅当action在其他位置设置为相同的字面值时,才会出现这种情况。请改用"something".equals( action.trim() )

action字符串中的字符是"something"字符,这是第一个条件。如果不是这样,那就没有。在测试中将其断言,记录,打印或在调试器中查看。

如果您打印一个字符串进行调试,请使用System.out.println ( "String = >" + string + "<" );之类的内容,以便在有任何尾随空格时显而易见。

答案 2 :(得分:4)

==无法完成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)

答案 3 :(得分:1)

我的猜测是你有没有在println中显示的尾随或前导空格。

将此与您使用action.trim() == 'something'的事实相结合意味着此测试也无效。

按照其他人的建议将其切换为.equals("something"),它可能会有效。

答案 4 :(得分:1)

您可以通过切换if子句来首先获得字符串文字,从而更好地防止空值。

但是,由于您似乎也希望防止参数值上的空格,您还可以使用StringUtils.trimToEmpty中的Apache Commons Lang对参数值进行空安全修整:

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

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

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

答案 5 :(得分:0)

只是一个疯狂的猜测:可能是这些“某些东西”中的一个包含例如西里尔字符看起来与拉丁语相同。在这种情况下,它可能是“o”。

答案 6 :(得分:0)

试试这个:

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

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

答案 7 :(得分:-7)

equals方法比较对象标识的字符串,而不是内容。要比较两个字符串的内容,请使用compareTo方法。