2012-07-16 56 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,這是列表和進一步討論的最佳答案。