java - Android Cursor NPE dumpCursorToString 返回值

标签 java android nullpointerexception cursor sqliteopenhelper

正如标题所述,我遇到了 NullPointerException,它发生在以下方法的第一个 getString() 处。为了调试,我使用 DatabaseUtils.dumpCursorToString() 来查看光标,并且光标内有值,但在 if 语句和 do 语句之间声明,有些事情发生了变化。我在单独 Activity 的另一种方法中使用了相同的代码,并且它工作完美。

public ArrayList<String> getMusic() {
    helper = new DbHelper(context);
    db = helper.getReadableDatabase();

    String[] cols = new String[]{MUSIC_ID, MUSIC_COUNTRY, MUSIC_BLUES, MUSIC_ROCK, MUSIC_METAL,
            MUSIC_HIPHOP, MUSIC_CLASSICAL, MUSIC_PUNK, MUSIC_TECHNO, MUSIC_JAZZ, MUSIC_OTHER};

    Cursor c = db.query(TABLE_MUSIC_INT, cols, null, null, null, null, null);

    int count = c.getCount();
    Log.v("INTEREST CURSOR ", "Count: " + count); // log row count
        if (c.moveToFirst()) {
            Log.v("INTEREST CURSOR ", DatabaseUtils.dumpCursorToString(c)); // dump cursor values
            do {
                musicInt.add(c.getString(0));
                musicInt.add(c.getString(1));
                musicInt.add(c.getString(2));
                musicInt.add(c.getString(3));
                musicInt.add(c.getString(4));
                musicInt.add(c.getString(5));
                musicInt.add(c.getString(6));
                musicInt.add(c.getString(7));
                musicInt.add(c.getString(8));
                musicInt.add(c.getString(9));
                musicInt.add(c.getString(10));
            } while (c.moveToNext());
        } else {
            Log.e("DB_GET_DATA ", " DB_GET_DATA == null");
        }
    c.close();

    return musicInt;
}

DatabaseUtils.dumpCursorToString(c) 输出:

01-15 19:57:01.201 6247-6247/us.enyi.enyi D/DB OPEN READ: Successful
01-15 19:57:20.440 6247-6247/us.enyi.enyi V/INTEREST CURSOR: Count: 1
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@2f32900f
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: 0 {
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    _id=1
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    country=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    blues=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    rock=Rock
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    metal=Metal
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    hiphop=HipHop
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    classical=Classical
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    punk=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    techno=Techno
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    jazz=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR:    musicother=Other
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: }
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: <<<<<

我尝试过其他从游标检索数据的方法,并在 SO 和 Android Docs 中阅读了无数线程,但没有找到任何有用的解决方案。我不太明白为什么光标显然有值,但 c.getString() 在 NPE 上失败。任何帮助将不胜感激。

解决方案:

初始化musicInt失败导致Cursor无处放置其收集的数据。将 musicInt 声明为:

ArrayList<String> musicInt;

而不是:

ArrayList<String> musicInt = new ArrayList<>();

教训是确保正确初始化变量。你会像我一样把头发拔掉。

最佳答案

我没有看到你在哪里声明(或初始化)musicInt。这可能就是导致您出现 NPE 的原因。

关于java - Android Cursor NPE dumpCursorToString 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34823361/

相关文章:

Java .xml 创建可绘制按钮背景

java - Android SDK Manager.exe 不起作用

java - 在 Java 中扩展一个类,以便可以将任何父类强制转换为它

java - 这段线程代码的错误在哪里?

java - 在另一台设备上使用 EasyCrypt 库完成密码时出错

java - 为什么会出现空指针异常?

java - 我在函数中遇到空指针异常,不知道如何修复它

java - 在 BaseAdapter 中填充数据时出现 NullPointerException

Java方法等于循环列表

面向 Java/*nix 程序员的 C#