2014-10-04 65 views
0

不知道我是否錯過了一些非常明顯的東西。我知道肯定我的String如下:Java(Android) - 無法檢測到字符串的第一個字符?

1This is a test message 

我想檢測的第一個字符是否爲「1」,所以這裏是我的一些代碼:

//This outputs '1' 
    Toast noCmd = Toast.makeText(Play.this, decodedMessage.substring(0,1), Toast.LENGTH_SHORT); 
    noCmd.show(); 

     if (decodedMessage.charAt(0) == 1) { 

      noCmd = Toast.makeText(Play.this, "This should show up", Toast.LENGTH_SHORT); 
      noCmd.show(); 

      noCmd = Toast.makeText(Play.this, finalMessage + " from " + sender,  Toast.LENGTH_SHORT); 
      noCmd.show(); 
     } 

    if (decodedMessage.substring(0,1) == "1") { 

     noCmd = Toast.makeText(Play.this, "This should show up", Toast.LENGTH_SHORT); 
     noCmd.show(); 

     noCmd = Toast.makeText(Play.this, finalMessage + " from " + sender, Toast.LENGTH_SHORT); 
     noCmd.show(); 
    } 

,你可以看,我試着用兩種方法讓if語句裏面的吐司出現。奇怪的是,當代碼運行時,只顯示頂部(無條件)的吐司。

任何想法?

回答

2

對於第一個,char'1'。代碼中現在發生的是,因爲您將char與一個整數進行比較,所以char正在使用其字符代碼轉換爲int。對於1,出現爲49,不等於整數1.您需要比較從String檢索到的char和代表數字「1」的char,這意味着您需要編寫它如'1'

對於第二個,您需要使用.equals()來測試String的等式,而不是==。如果有兩個String對象st具有相同的內容,那麼您仍然會發現s==t會出現錯誤,除非它們碰巧指向同一位內存(即它們是相同的實例) 。要檢查它們是否具有相同的內容,你檢查

s.equals(t) 

而不是

s==t 

因此,簡言之,使第一個

if (decodedMessage.charAt(0) == '1') { 
    //toast stuff 
} 

,第二個

if ("1".equals(decodedMessage.substring(0,1))) { 
    //toast stuff 
} 

原因,順便說一下,不寫

if (decodedMessage.substring(0,1).equals("1")) { 
    //toast stuff 
} 

反而是,如果String在其上調用.equals()null那麼你會用NullPointerException,通常你想避免告終。其實在這種情況下,它會好一些,因爲substring()調用將不會返回null,但在一般情況下,如果你想測試s"something"是否相等,那麼你使用

"something".equals(s) 

而不是

s.equals("something") 

以防萬一snull

+0

謝謝!接受這個答案,因爲它是第一個,也是最全面的(對於其他讀者)。我知道有什麼問題......我沒有使用.equals()... – 2014-10-04 19:55:32

+0

@ingredient_mosteroid不客氣:) – 2014-10-04 19:56:15

+0

很好的解釋,但Java使用Unicode,而不是ASCII。 Java的'char'數據類型存儲一個UTF-16編碼單元,其中一個或兩個編碼Unicode編碼點。一個基本碼點和零個或多個組合碼點形成一個字形,這是人們在使用術語「字符」時所想到的。數字1被編碼爲一個「char」,因此可以被寫爲char文字'1'。 – 2014-10-05 02:36:09

0

比較字符串,您需要使用equals方法:

if("1".equals(decodedMessage.charAt(0))){ 

}