好的,这是愚蠢的,但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
答案 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方法。