0

在自定义 SimpleCursorAdapter 中,我试图比较一个状态字符串,结果令人困惑。

我的字符串是这样从光标初始化的(我已经检查过toast它是否包含预期值)。

String visitStatus = cursor.getString(cursor.getColumnIndex(CallData.COLUMN_VisitStatus));

visitStatus 可以为 null、Open、Canceled 或 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、customadapter、viewpagers、pagertitlestrips 和列表行 xml 模板的噩梦!

住手!

4

2 回答 2

4

这是因为visitStatusnull。每当您尝试访问其方法时,它都会崩溃。(即:visitString.equals()、、visitString.length()等,都会崩溃。

但是,等式运算符 ( ==) 支持null其两侧的参数。(所以,if (null == null)是一张有效的支票。)

你应该像这样检查:

if (visitStatus != null && visitStatus.equals("Complete")) {
    // ...
}

或者,您可以执行支持null参数的“Yoda 语法”(向后检查):

if ("Complete".equals(visitStatus)) {
    // ...
}

另外,最后一点:您不能使用比较字符串内容==(如,您不能做"a" == new String("a"),也不能visitString == "Complete")。有关详细说明,请参阅此问答线程

于 2012-12-13T18:27:13.067 回答
0

String应该使用比较.equals()

原因是NullPointerException因为visitStatusnull

于 2012-12-13T18:26:19.510 回答