在自定义SimpleCursorAdapter中,我正在尝试比较状态字符串,结果令人困惑。
我的字符串是从光标初始化的(我已用toast
检查它是否包含预期的值)。
String visitStatus = cursor.getString(cursor.getColumnIndex(CallData.COLUMN_VisitStatus));
visitStatus可以为null,Open,Cancelled或Complete。
如果我尝试将visitStatus与“引号中的任何字符串”进行比较,则应用程序会因NullPointerException而崩溃。只有当我与null比较时,我才能得到任何东西 - 这对我没用;
if(visitStatus.equals(null)) // the app crashes with a NullPointerException
if(visitStatus == null) // doesn't crash
if(visitStatus != null) // doesn't crash
if(visitStatus == "Complete") // doesn't crash or do anything
if(visitStatus.equals("Complete")) // the app crashes with a NullPointerException.
基本上,我可以比较null,但只能以不应该工作的方式进行比较。我无法与实际字符串比较,例如“打开”或“完成”。
我对此略显坚定,并且严重错过了我的C#舒适区。这个特定的活动是listfragments,contentproviders,customadapters,viewpagers,pagertitlestrips和list row xml templates的噩梦!
HALP!
答案 0 :(得分:3)
这是因为visitStatus
是null
。每当您尝试访问其方法时,它都会崩溃。 (即:visitString.equals()
,visitString.length()
等,一切都会崩溃。)
但是,等于运算符(==
)在其两侧都支持null
个参数。 (因此,if (null == null)
是有效的检查。)
你应该这样检查:
if (visitStatus != null && visitStatus.equals("Complete")) {
// ...
}
或者,您可以执行“Yoda语法”(向后检查),它支持null
个参数:
if ("Complete".equals(visitStatus)) {
// ...
}
另外,最后一点:您无法使用==
比较字符串内容(例如,您不能"a" == new String("a")
,也不能visitString == "Complete"
)。有关详细说明,请参阅this Q&A thread。
答案 1 :(得分:0)
String
比较 .equals()
由于NullPointerException
为visitStatus
null