android - "Attempt to Invoke Virtual Method"到底是什么意思?

标签 android nullpointerexception nullreferenceexception

我是一名初学者级别的 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 总是会给出这个错误。

任何人都可以向我解释这到底是什么意思,以及在出现此错误的一般情况下我应该采取什么方法?

这是我在我的应用程序中遇到的一种奇怪行为,这让我发疯。

这个函数工作正常

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: 尝试调用虚拟方法 '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);
}

将不胜感激。

最佳答案

正如 user2864740 所明确解释的那样,

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 - "Attempt to Invoke Virtual Method"到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31620831/

相关文章:

asp.net - 如何从另一个用户控件继承用户控件?

c# - 如何为 Unity 获取帧速率独立的触摸位置?

java - ActivityCompat.requestPermissions 不显示提示

android - findViewById() 为对话框中的 View 返回 null

android - 何时使用 setX 和 setY

java.lang.NullPointerException : Attempt to invoke virtual method 'boolean java.util.Vector.add(java.lang.Object)' on a null object reference

c# - 检查空值后出现空引用异常(检查空值不起作用)

android - 无法在 Controller 中操作工厂信息

java - 如何在 Android 上暂停/延迟?

c# - 如何在 Windows Phone 8 的某些数据透视页上隐藏应用程序栏