SQLite:不理解空指针

时间:2012-12-07 17:08:17

标签: android sqlite

下面的代码显示了此警告:

  

空指针访问:变量civs在此处只能为null   位置

public static List<String> getCivs(String game) {
    List<String> civs = null;
    System.err.printf("game: %s\n", game);

    SQLiteDatabase db = godSimDBOpenHelper.getReadableDatabase();
    String where = GAME_COLUMN + "= ?";
    Cursor cursor = db.query(GAMES_TABLE, new String[] {CIV_COLUMN}, where, new String[] {game}, null, null, null);

    while (cursor.moveToNext()) {
        System.err.println("now here");
        System.err.println(cursor.getString(0));
        civs.add(cursor.getString(0));  //warning appears for this line
    }

    return civs;
}

果然,当我跑步时,它会崩溃。根据定义,我不明白为什么这必须为空。我意识到我正在将变量初始化为null(我只是这样做,因为如果我不这样做,Eclipse会给我另一个错误),但是我在while循环中的列表中添加了值。这是不是意味着它不再是空的?

我很抱歉,如果我是密集的,但我不知道这里有什么问题。也许在我初始化变量的方式。只是不确定。

谢谢!

2 个答案:

答案 0 :(得分:1)

失败的原因是,当您尝试在其上运行add方法时,变量civsnull。所以实际上,你试图引用一个不存在的类实例(你所做的就是创建一个能够指向实现List接口的类的类实例的变量)。

因此,为了使这项工作,您必须使这个变量(当前无点)指向一些有意义的东西。在这种情况下,这意味着您必须创建一个实现列表接口的类的新实例,并将您的变量设置为指向该实例。

尝试以下

public static List<String> getCivs(String game) {

    // here, you are now creating a new instance of the class ArrayList and 
    // setting civs to point at this instance.
    List<String> civs = new ArrayList<String>(); 

    System.err.printf("game: %s\n", game);

    SQLiteDatabase db = godSimDBOpenHelper.getReadableDatabase();
    String where = GAME_COLUMN + "= ?";
    Cursor cursor = db.query(GAMES_TABLE, new String[] {CIV_COLUMN}, where, new String[] {game}, null, null, null);

    while (cursor.moveToNext()) {
        System.err.println("now here");
        System.err.println(cursor.getString(0));
        civs.add(cursor.getString(0));  //warning appears for this line
    }

    return civs;
}

只是一个小小的提示,这是非常初步的事情,如果你投入一点时间并通过oracle的核心java路径阅读,你会安心自己很沮丧。

http://docs.oracle.com/javase/tutorial/

答案 1 :(得分:1)

您正在尝试向null对象添加内容。您的civs列表不存在;你没有创造它。

请改为尝试:

List<String> civs = new ArrayList<String>();