2014-10-04 66 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))){ 

}