为什么我的字符串比较不起作用?
好吧,这是愚蠢的,但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的值是“某事”
Action: something
你的第二次比较是错误的。 您还应该使用equals
而不是==
,如下所示:
if (action.trim().equals("something"))
==
运算符比较(String)对象的引用 ,在正常情况下, 相等的字符串不会自动具有相同的引用,即它们是不同的对象。 (除非两者都内化 ,但通常你不应该考虑它)
除此之外,您的示例工作正常,第一次比较是有效的。 尝试修复第二次比较。 如果它有效,你就找到了问题所在。 如果没有,请尝试使用调试器并仔细检查所有内容。
PS:在将文字字符串与动态字符串对象进行比较时,最好在文字字符串上调用equals
方法:
"something".equals(action)
这样,当字符串对象为null时,您可以避免NullPointerExceptions。
你的第二个条件不太可能是真的 – 你正在测试修剪action
创建的字符串对象是否与字符串文字"something"
是同一个对象。 仅当action
在其他位置设置为相同的字面值时才会出现这种情况。 使用"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方法。