Java(Android) - 无法检测到字符串的第一个字符?
不知道我是否错过了一些非常明显的东西。我知道肯定我的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语句里面的吐司出现。奇怪的是,当代码运行时,只显示顶部(无条件)的吐司。
任何想法?
对于第一个,char
是'1'
。代码中现在发生的是,因为您将char
与一个整数进行比较,所以char
正在使用其字符代码转换为int
。对于1
,出现为49,不等于整数1.您需要比较从String
检索到的char
和代表数字“1”的char
,这意味着您需要编写它如'1'
。
对于第二个,您需要使用.equals()
来测试String
的等式,而不是==
。如果有两个String
对象s
和t
具有相同的内容,那么您仍然会发现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")
以防万一s
是null
。
比较字符串,您需要使用equals
方法:
if("1".equals(decodedMessage.charAt(0))){
}
1
是值1的整数。如果你想要的ASCII 1
,在单引号使用'1'
其中有49
对于比较字符串,请使用equals()
而不是==
。见How do I compare strings in Java?
谢谢!接受这个答案,因为它是第一个,也是最全面的(对于其他读者)。我知道有什么问题......我没有使用.equals()... – 2014-10-04 19:55:32
@ingredient_mosteroid不客气:) – 2014-10-04 19:56:15
很好的解释,但Java使用Unicode,而不是ASCII。 Java的'char'数据类型存储一个UTF-16编码单元,其中一个或两个编码Unicode编码点。一个基本码点和零个或多个组合码点形成一个字形,这是人们在使用术语“字符”时所想到的。数字1被编码为一个“char”,因此可以被写为char文字'1'。 – 2014-10-05 02:36:09