【问题标题】:Why doesn't my string comparison work?为什么我的字符串比较不起作用?
【发布时间】:2014-09-27 10:50:43
【问题描述】:

好吧,这很愚蠢,但是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”

Action: something

【问题讨论】:

  • 什么不起作用? “嘿”是否只打印一次,您是否期望它会打印两次?你的控制台上没有出现“嘿”吗?
  • 他非常具体://我确定了 2 个 if,但没有一个是有效的。
  • 请不要称它为“JAVA”——它是“Java”。该名称不是首字母缩写词,因此您无需全部大写。
  • 好的。我不会再称它为“JAVA”了。 :) 1. 第一个 if(action.equals) 首先是工作,但在另一个函数中,我评估变量和 if in not working,我确定值是相同的。 Anw,我的问题,我将尝试单独找出问题所在。 2. 感谢所有答案,我不会再使用“==”进行这种评估,其次,我不会像 5 分钟前那样使用 compareTo()(仍然是相同的评估类型)。问题已解决。 (有点:))
  • 我编辑了标题:JAVA -> Java :)

标签: java


【解决方案1】:

您的第二个比较是错误的。您还应该使用equals 而不是==,如下所示:

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

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

除此之外,您的示例运行良好,并且第一次比较有效。尝试修复第二个比较。如果它有效,你就发现了你的问题。如果没有,请尝试使用调试器并仔细检查所有内容。

PS:当比较文字字符串和动态字符串对象时,最好在文字字符串上调用equals方法:

"something".equals(action)

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

【讨论】:

  • +1 用于在字符串文字上调用 equals 以避免 NullPointerException。
【解决方案2】:

您的第二个条件不太可能为真 - 您正在测试通过修剪 action 创建的字符串对象是否与字符串文字 "something" 相同的对象。仅当 action 在其他地方设置为相同的文字值时,这才是正确的。请改用"something".equals( action.trim() )

您的第一个条件为真,action 字符串中的字符是字符"something"。如果它不是真的,那么它不会。在测试中断言、记录、打印或在调试器中查看。

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

【讨论】:

  • 您的答案应该是首选,它更正确,甚至可以避免 NPE:s(理论上,在这种情况下并非如此)。哦,好吧,希望其他人也能注意到这一点。
  • +1 用于在 ">" 中打印字符串,这只是突出显示了一个尾随换行符,它与我的 string.matches() 混淆了!
【解决方案3】:

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

【讨论】:

  • 你说的是真的,但是如果你解释一下为什么它是真的会更有帮助。 (即a.equals(b) 测试两个字符串的内容是否相同,但a == b 仅在 a 和 b 都引用同一个 String 对象时返回 true。)
【解决方案4】:

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

将此与您正在使用 action.trim() == 'something' 的事实结合起来意味着此测试也将不起作用。

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

【讨论】:

  • 我经常使用System.out.println("Action: [" + action + ']'); 进行调试,因为这样您就可以看到尾随空格。
  • 抱歉,应该是System.out.println("Action: [" + action + "]");。我今天早上一直在写 JavaScript :)
【解决方案5】:

您可以通过切换 if 子句以首先使用字符串文字来更好地防止空值。

但由于您似乎还想防止参数值出现空白,您还可以使用来自Apache Commons LangStringUtils.trimToEmpty 对参数值进行空安全修剪:

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

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

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      试试这个:

      String action = request.getParameter("action");
      System.out.println("Action: " + action);
      
      if(action.trim().equals("something"))
      {
          System.out.println("hey");            
      }
      

      【讨论】:

        【解决方案8】:

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

        【讨论】:

        • 这是完全错误的。 String.equals() 比较字符串并在它们相等时返回 true——正如人们所期望的那样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 2011-07-09
        • 1970-01-01
        相关资源
        最近更新 更多