2012-07-16 134 views
0

我尝试编程一个计算器,以便学习Android开发中的开始,但我面临的问题是人类无法理解。我希望你不是人。«如果»变得疯狂

我如果条件请看:

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

    } 

(您可能注意到,我用的isEmpty()方法,而不是因为的isEmpty()不支持API7«结果= “”!») 。

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

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调试器两种结果)

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

有什么想法?

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

谢谢:)

+2

看看这个:http://stackoverflow.com/questions/3885753/string-comparison-and-string-interning-in-java – 2012-07-16 12:10:33

+2

尝试'!result.equals(“”)' – 2012-07-16 12:10:42

+0

Don'使用'equals(“”)'。使用'isEmpty()'。 – m0skit0 2012-07-16 12:17:34

回答

0

尝试使用contentEquals来代替。例如。

if (!result.contentEquals("")) 

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

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

+0

好的,谢谢你的回答。它没有奏效,我仍然得到相同的错误,但现在看起来正确:)。 – user1527491 2012-07-16 12:13:10

+0

@ user1527491我已经使用您的应用测试了此更改,它工作正常。按'5'然后'0'将显示'50',但按'0'不会导致文本视图发生变化。 – 2012-07-16 12:17:28

+0

@Ian:为什么'contentEquals()'而不是简单的'equals()'? – 2012-07-16 12:21:57

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

变化:

if (result != "") 

收件人:

if (!result.equals("")) 

或更优选地,使用TextUtils其中检查null太:

if(!TextUtils.isEmpty(result)) 
+0

'!result.isEmpty()'就够了;) – m0skit0 2012-07-16 12:16:51

+0

我不这么认为。如果** Android API **级别低于9,该怎么办? – waqaslam 2012-07-16 12:22:38

0

的expresion在if子句检查是否引用,而不是值,在可变result不等于这就是对象""为什么你总是真实的。而不是result != ""使用!result.equals("")

0

你需要调用这个方法!result.equals("")

result == " "会比较什么,而不是String对象的内容对象实例。

0

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

2.所以字符串必须遵循相同的规则。

实施例:

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

    } 
0

作为其他的答案说,应该使用String.equals()到实际内容比较两个Strings(见在Javadoc中equals描述),而不是由测试==为对象引用的相等性。

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

因此,有些(相当特殊的)情况下,它适合于使用==来比较字符串。请参阅this question,这是列表和进一步讨论的最佳答案。