"尝试调用虚拟方法"真正意味着什么?

Gav*_*vin 5 android nullpointerexception nullreferenceexception

我是一名初级Android开发人员,每天都会遇到很多错误及其解决方案.我注意到我很多次java.lang.NullPointerException: Attempt to invoke virtual method 'xxx' on a null object reference.Upto NullPointerException,听起来很熟悉,某些东西的价值为null,但问题从下一个短语开始.[请关注代码问题]

在我看来,我发现这个非常不清楚,因为Android工作室不像Eclipse只能说出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;
}
Run Code Online (Sandbox Code Playgroud)

但另一个功能给我错误

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;
}
Run Code Online (Sandbox Code Playgroud)

这两个函数具有相似的格式并放在同一个类中,但为什么只有第二个函数会出错?如果我考虑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);
}
Run Code Online (Sandbox Code Playgroud)

详细的帮助将不胜感激.

Ant*_*met 6

正如user2864740清楚解释的那样,

虚方法是一种多态解析的方法(私有方法不是'虚拟'也不是最终方法,也不是静态方法); 关于它和原因没有任何"特殊",即null.foo()

您在以下行收到错误

Cursor c =  db.query(TABLE_NAME, ALL_KEYS,
            where, null, null, null, null);
Run Code Online (Sandbox Code Playgroud)

该错误清楚地提到了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它将是null.

要修复它,请确保正确初始化db变量.你还说它在其他地方工作正常,确保你没有db在代码中的其他地方使对象无效.