簡體   English   中英

嘗試在空對象引用上調用虛擬方法-Android

[英]Attempt to invoke virtual method on a null object reference - Android

我有時會從生產應用程序中獲取崩潰報告,我認為下面的行是問題的根源:

嘗試在foto.studio.MainActivity.onCreateOptionsMenu(MainActivity.java:267)上的空對象引用上調用虛擬方法'java.util.ArrayList foto.studio.SQLiteDataSource.getAllImageItems()'

它指向MainActivity內部的方法(以及用“ ==>”突出顯示的負責行):

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);

        final Menu m = menu;
        final MenuItem item = menu.findItem(R.id.action_notifications);
        View actionView = item.getActionView();
        notifTextView = (TextView) actionView.findViewById(R.id.notifTextView);

        ArrayList <ImageItemsSetter> pendingOrdersList = new ArrayList<ImageItemsSetter>();

        ===> pendingOrdersList = datasource.getAllImageItems(); <===

        Log.i("value", "String calue of pendingorderlist: " + String.valueOf(pendingOrdersList.size()));
        String unreadNotifs = String.valueOf(pendingOrdersList.size());

        if (!unreadNotifs.equals("0")) {
            notifTextView.setText(unreadNotifs);
        } else {
            notifTextView.setVisibility(View.GONE);
        }       

        item.getActionView().setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                m.performIdentifierAction(item.getItemId(), 0);
            }
        });


        return true;
    }

以及來自SQLiteDataSource的方法:

public ArrayList<ImageItemsSetter> getAllImageItems() {
        Cursor cursor = database.query(SQLiteHelper.TABLE_IMAGES,
                allColumnsImages, null, null, "product", null, null);

        //Log.i("LOGTAG", "Returned " + cursor.getCount() + " rows");
        ArrayList<ImageItemsSetter> products = cursorToListImages(cursor);
        return products;
    }

有什么事嗎 我的ArrayList(pendingOrdersList)在使用前就已初始化,為什么它說它為null?

我初始化數據庫的行:

@Override
    protected void onResume() {
        super.onResume();
        initImageLoader();

        datasource = new SQLiteDataSource(this);
        datasource.open();
        invalidateOptionsMenu();

        // facebook analytics
        AppEventsLogger.activateApp(this);

        //get or update appVersion string
        getAppVersion();

    }

完整報告:

java.lang.RuntimeException:無法啟動活動ComponentInfo {foto.studio/foto.studio.MainActivity}:java.lang.NullPointerException:嘗試調用虛擬方法'java.util.ArrayList foto.studio.SQLiteDataSource.getAllImageItems()'在android.app.ActivityThread.access $ 900(ActivityThread.java:177)上android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)上android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693)的空對象引用上)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1448)在android.os.Handler.dispatchMessage(Handler.java:102)在android.os.Looper.loop(Looper.java:145)在android .app.ActivityThread.main(ActivityThread.java:5942)(位於java.lang.reflect.Method.invoke(本機方法)(位於java.lang.reflect.Method.invoke(Method.java:372))(位於com.android.internal) .os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1400)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)原因:java.lang.NullPoi nterException:嘗試在android.app.Activity的foto.studio.MainActivity.onCreateOptionsMenu(MainActivity.java:267)上的null對象引用上調用虛擬方法'java.util.ArrayList foto.studio.SQLiteDataSource.getAllImageItems()'。 com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:606)上的com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:980)上的onCreatePanelMenu(Activity.java:2947)在com.android.internal.policy.impl.PhoneWindow $ 1.run(PhoneWindow.java:308)在com.android.internal.policy.impl.PhoneWindow.doPendingInvalidatePanelMenu(PhoneWindow.java:954)在com.android.internal android.app.Activity.onRestoreInstanceState(Activity.java:1092)的policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2194)android.app.Instrumentation的android.app.Activity.performRestoreInstanceState(Activity.java:1037) .callActivityOnRestoreInstanceState(Instrumentation.java:1175)在android.app.ActivityThread.performLaunchActi vity(ActivityThread.java:2666)...還有10個

在onCreateOptionsMenu()中使用自定義代碼時要小心:根據Android版本和其他因素,可以在onCreate()之后隨時調用此方法。 調用該方法時,您的數據源顯然尚未准備好,因此您也必須處理這種情況。

我可能建議您在初始化菜單項之前測試數據源是否為空,如果數據源尚未准備好,則在數據源准備好后立即對其進行初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM