0

我下面的代码显示了这个警告:

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

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 循环内的列表中。这是否意味着它不再为空?

对不起,如果我很密集,但我只是看不出这里有什么问题。也许以我初始化变量的方式。只是不确定。

谢谢!

4

2 回答 2

1

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

试试这个:

List<String> civs = new ArrayList<String>();
于 2012-12-07T17:10:08.827 回答
1

它失败的原因是该变量civsnull在您尝试对其运行 add 方法时发生的。因此,实际上,您正在尝试引用一个不存在的类实例(您所做的只是创建了一个能够指向实现 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/

于 2012-12-07T17:09:44.707 回答