"Attempt to Invoke Virtual Method" 到底是什么意思?
What does "Attempt to Invoke Virtual Method" really mean?
我是初级 Android 开发人员,每天都在与许多错误及其解决方案作斗争。我注意到我很多次得到 java.lang.NullPointerException: Attempt to invoke virtual method 'xxx' on a null object reference
。截至 NullPointerException
,有些东西的值为 null 听起来很熟悉,但问题从下一个短语开始。 [问题请看代码]
在我看来,我发现这非常不清楚,因为 Android Studio 与 Eclipse 不同,只会对任何类型的问题说 Attempt to invoke virtual method 'xxx' on a null object reference
,真的很难知道我遗漏了什么。无论是游标、数据库、数组列表还是任何你能想到的对象,Android studio like crazy robot 总是给出这个错误。
任何人都可以向我解释这到底是什么意思,在我收到此错误的一般情况下我的方法应该是什么?
这是我在我的应用程序中遇到的一种奇怪行为,这让我抓狂。
这个函数工作正常
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;
}
两个函数格式相似,放在相同的地方class,但为什么只有第二个函数出错?如果我考虑 NPE,那么 getAllRows()
功能也应该如此,但事实并非如此。
已编辑
函数 updateRow() 在另一个 class 中被调用,它描述了一些不同的数据库函数,这是如何 -
Playlist allPlaylistDB;
public PlaylistSongs(Context ctx) {
this.context = ctx;
allPlaylistDB = new Playlist(context); // We have initiated another database class
myDBHelper = new ReaderDB(context);
}
将不胜感激。
您的 SQL 声明似乎无效。
您可能需要使用 ;
、
关闭 SQL 语句
即String where = COLUMN_NAME_ID + " = " + ID + ";"
清楚地解释了
A virtual method is a method resolved polymorphically (a private
method would is not 'virtual' nor is a final method nor are static
methods); there is nothing 'special' about it and the cause, which is
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
,因为您正试图在 null
引用上调用(虚拟)方法 query()
。弄清楚出了什么问题的另一件事是在上面的行中放置一个断点,然后你会看到 db
将为空。
要修复它,请确保正确初始化 db 变量。你还说它在其他地方工作正常,确保你没有在代码的其他地方取消 db
对象。
我是初级 Android 开发人员,每天都在与许多错误及其解决方案作斗争。我注意到我很多次得到 java.lang.NullPointerException: Attempt to invoke virtual method 'xxx' on a null object reference
。截至 NullPointerException
,有些东西的值为 null 听起来很熟悉,但问题从下一个短语开始。 [问题请看代码]
在我看来,我发现这非常不清楚,因为 Android Studio 与 Eclipse 不同,只会对任何类型的问题说 Attempt to invoke virtual method 'xxx' on a null object reference
,真的很难知道我遗漏了什么。无论是游标、数据库、数组列表还是任何你能想到的对象,Android studio like crazy robot 总是给出这个错误。
任何人都可以向我解释这到底是什么意思,在我收到此错误的一般情况下我的方法应该是什么?
这是我在我的应用程序中遇到的一种奇怪行为,这让我抓狂。
这个函数工作正常
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;
}
两个函数格式相似,放在相同的地方class,但为什么只有第二个函数出错?如果我考虑 NPE,那么 getAllRows()
功能也应该如此,但事实并非如此。
已编辑
函数 updateRow() 在另一个 class 中被调用,它描述了一些不同的数据库函数,这是如何 -
Playlist allPlaylistDB;
public PlaylistSongs(Context ctx) {
this.context = ctx;
allPlaylistDB = new Playlist(context); // We have initiated another database class
myDBHelper = new ReaderDB(context);
}
将不胜感激。
您的 SQL 声明似乎无效。
您可能需要使用 ;
、
即String where = COLUMN_NAME_ID + " = " + ID + ";"
A virtual method is a method resolved polymorphically (a private method would is not 'virtual' nor is a final method nor are static methods); there is nothing 'special' about it and the cause, which is 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
,因为您正试图在 null
引用上调用(虚拟)方法 query()
。弄清楚出了什么问题的另一件事是在上面的行中放置一个断点,然后你会看到 db
将为空。
要修复它,请确保正确初始化 db 变量。你还说它在其他地方工作正常,确保你没有在代码的其他地方取消 db
对象。