下面的代码显示了此警告:
空指针访问:变量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循环中的列表中添加了值。这是不是意味着它不再是空的?
我很抱歉,如果我是密集的,但我不知道这里有什么问题。也许在我初始化变量的方式。只是不确定。
谢谢!
答案 0 :(得分:1)
失败的原因是,当您尝试在其上运行add方法时,变量civs
为null
。所以实际上,你试图引用一个不存在的类实例(你所做的就是创建一个能够指向实现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路径阅读,你会安心自己很沮丧。
答案 1 :(得分:1)
您正在尝试向null
对象添加内容。您的civs
列表不存在;你没有创造它。
请改为尝试:
List<String> civs = new ArrayList<String>();