我是一名初级Android开发人员,每天都会遇到很多错误及其解决方案。我注意到我很多时候得到java.lang.NullPointerException: Attempt to invoke virtual method 'xxx' on a null object reference
。高达NullPointerException
,听起来很熟悉,某些东西的值为null,但问题从下一个短语开始。 [请按照代码查询问题]
在我看来,我发现这一点非常不清楚,因为不像Eclipse的Android Studio只会对任何类型的问题说Attempt to invoke virtual method 'xxx' on a null object reference
,所以我很难知道我在哪里缺少点。无论是游标,数据库,arraylist还是你能想到的任何对象,像疯狂机器人这样的Android工作室总会给出这个错误。
任何人都可以向我解释一下这是什么意思,在一般情况下我应该采用什么方法来解决这个错误?
这是我在我的应用中遇到的一种奇怪的行为,它让我发疯。
此功能正常
ArrayList<HashMap<String, String>> getAllRows() {
Cursor c = db.query(TABLE_NAME, ALL_KEYS, null, null, null, null, null); // THIS LINE IS MY POINT
//
...
//
c.close();
return profilesArray;
}
但另一个函数给我错误
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)' on a null object reference
public boolean updateRow(long ID, int tracks) {
String where = COLUMN_NAME_ID + " = " + ID;
Cursor c = db.query(TABLE_NAME, ALL_KEYS,
where, null, null, null, null); // At this line. What happened to this now, if it's working fine in getAllRows()
String title = null;
if (c != null) {
c.moveToFirst();
title = c.getString(1);
}
c.close();
//
...
//
return db.update(TABLE_NAME, newValues, where, null) != 0;
}
这两个函数都有相似的格式并放在同一个类中,但为什么只有第二个函数会出错?如果我考虑NPE,那么它应该是getAllRows()
功能的情况,但事实并非如此。
被修改
函数updateRow()在另一个类中调用,它描述了一些不同的数据库函数,这里是如何 -
Playlist allPlaylistDB;
public PlaylistSongs(Context ctx) {
this.context = ctx;
allPlaylistDB = new Playlist(context); // We have initiated another database class
myDBHelper = new ReaderDB(context);
}
详情请帮助。
答案 0 :(得分:6)
由user2864740明确解释,
虚方法是一种多态解析的方法(私有方法) 方法不是虚拟的&#39;也不是最终方法也不是静态的 方法);没有什么特别的&#39;关于它和原因,这是 null.foo()
您在下一行收到错误
Cursor c = db.query(TABLE_NAME, ALL_KEYS,
where, null, null, null, null);
错误明确提到空引用正在调用android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)
。在您的代码中可以是null
?它必须是db
,因为您尝试在query()
引用上调用(虚拟)方法null
。找出问题的其他方法是在上面的行放置一个断点然后你会看到db
为空。
要修复它,请确保正确初始化db变量。你还说它在其他地方工作得很好,确保你没有在代码中的其他地方使db
对象无效。
答案 1 :(得分:-1)
您的SQL语句似乎无效。
您可能需要使用;
,
即。 String where = COLUMN_NAME_ID + " = " + ID + ";"