Android - string.equals(null)即使在初始化字符串时也返回空指针

时间:2013-09-03 13:43:51

标签: android string nullpointerexception

我在我的应用程序中执行此数据库操作,其中我拉取某个列值以检查它是否存在。我没有问题执行查询并将值分配给字符串(我甚至可以在日志中输出此值)。当我试图检查我的字符串是否等于null时,我的问题出现了,具有讽刺意味的是,我得到了一个N​​ullPointer。

这是我的功能:

public boolean isDone(String id){
    boolean isDone = false;
    String timeOut = new String();
    timeOut = "A";

    String query = "SELECT TimeOut FROM " + TABLE_ROUTE_TABLE + " WHERE _id = '" + id + "'";
    Cursor cursor = mDB.rawQuery(query, null);

    if(cursor.moveToFirst()){
        timeOut = cursor.getString(cursor.getColumnIndex("TimeOut"));
        Log.d("Hi", "timeOut = " + timeOut);
    }

    if(timeOut.equals(null)){
        isDone = false;
    }
    else{
        isDone = true;
    }

    return isDone;
}

我正在if(timeOut.equals(null))获得NPE。当我将字符串作为布尔条件的一部分时,当我能够使用它并显示其值(有时可能为null)时,我不明白为什么我得到NPE。

我有一种感觉,我忽略了一些基本的东西。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

如果您的timeOut变量为null,则此测试将始终导致NPE,因为null实例没有方法。您应该使用==运算符进行测试,例如timeOut == null

为什么它是null,但是,我无法理解,因为你说它在打印时有价值。

答案 1 :(得分:1)

问题是equals将2个字符串比较在一起,因为其中一个为null,你得到了NPE。

您可以通过测试

来修复它
  

timeOut == null

答案 2 :(得分:1)

是的... null实例没有方法..

因此,您应该初始化变量 timeOut == null;

答案 3 :(得分:1)

应该以这种方式进行空检查:

 if(timeout == null)

因为你想知道对象是否存在,这意味着,如果指针是否为空。字符串的内容不能为null,但指向它的指针可以为null。