«如果»变得疯狂

时间:2012-07-16 12:07:34

标签: java android eclipse

我尝试编写一个计算器,以便学习Android开发中的开端,但我面临着一个人类无法理解的问题。我希望你不是人。

看看我的If条件:

    if (result != "")
    {
        textView.append("0");

    }

(您可能会注意到我使用了«result!=“”»而不是isEmpty()方法,因为API7中不支持isEmpty()。

好。现在看看我的两个“结果”变量

result  "" (id=830012674816)    
count   0   
hashCode    0   
offset  0   
value    (id=830012674848)  

result  "" (id=830022154000)    
count   0   
hashCode    0   
offset  0   
value    (id=830022154032)  

(我从Eclipse Debugger复制了两个结果)

第一个结果是OK:这是我在启动程序时得到的结果:if是否完成了工作并且通过了。 第二个似乎完全相同,但由于一个未知的原因,它进入if并追加零。我按下“加号”按钮后出现此问题。

有什么想法吗?

如果您发现缺少信息或者您不了解问题,可以在此处找到整个工作区(正在进行中):http://www.sendspace.com/file/udp5d3。 要重现此问题,请在程序启动时按“零”按钮,并注意它通常不会出现。然后输入任何数字,如“104”,“7”或“73”,按“加号”按钮,然后“零”。零不应出现在这里。

谢谢:)

7 个答案:

答案 0 :(得分:5)

请勿按!=比较字符串(或任何对象)。使用equals()!("".equals(result))

!(result.equals(""))

==用于检查引用是否包含相同的对象,而不是对象包含相同的值,

例如

Integer i1=new Integer(1);
Integer i2=new Integer(1);
Integer i3=i1;
//checking references
System.out.println(i1==i2);//false
System.out.println(i1==i3);//true

//checking values
System.out.println(i1.equals(i2));//true
System.out.println(i1.equals(i3));//true

答案 1 :(得分:1)

变化:

if (result != "")

要:

if (!result.equals(""))

或更优选地,使用TextUtils来检查null

if(!TextUtils.isEmpty(result))

答案 2 :(得分:0)

请尝试使用contentEquals。 E.g。

if (!result.contentEquals(""))

http://developer.android.com/reference/java/lang/String.html#contentEquals(java.lang.CharSequence

原因是在Java ==中如果两个对象引用指向同一个实例,则返回true,而您想要比较两个字符串以检查它们是否包含相同顺序的相同字符,这不是同样的事情。

答案 3 :(得分:0)

if子句中的表达式检查变量result中的引用而不是值是否等于对象"",这就是为什么你总是如此。而不是result != ""使用!result.equals("")

答案 4 :(得分:0)

您需要调用此方法!result.equals("")

result == " "将比较对象实例而不是String对象内容。

答案 5 :(得分:0)

1。在Java中使用.equals()比较对象,而String是Java中的对象。

2。因此String必须遵循相同的规则。

示例:

 if (!(result.equals("")))
    {
        textView.append("0");

    }

答案 6 :(得分:0)

正如其他答案所说,应该使用String.equals()来比较两个Strings的实际内容(参见javadoc中equals的描述),而不是通过{来测试对象引用的相等性{1}}。

但是,正如您在问题中所提到的,当您的应用程序第一次运行比较时,在两个字符串上使用==评估为true。这是因为String interning。最有可能的是,在变量初始化期间,您已将==指定为与之后与result进行比较的相同值的常量。 然后,由于JVM使用interning来保持给定值的""的单个实例常量,String变量包含的引用实际上与您在比较中的常量引用和相等性测试相同评估为真。

因此,当使用result来比较字符串时,有(非常特殊的)情况。请参阅this question,这是列表和进一步讨论的最佳答案。