java - 尝试在空对象引用上调用虚拟方法 - Android

标签 java android arrays arraylist android-sqlite

我有时会从我的生产应用程序中收到崩溃报告,我认为下面的行是问题的根源:

Attempt to invoke virtual method 'java.util.ArrayList foto.studio.SQLiteDataSource.getAllImageItems()' on a null object reference at foto.studio.MainActivity.onCreateOptionsMenu(MainActivity.java:267)

它在 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: Unable to start activity ComponentInfo{foto.studio/foto.studio.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList foto.studio.SQLiteDataSource.getAllImageItems()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) at android.app.ActivityThread.access$900(ActivityThread.java:177) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5942) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList foto.studio.SQLiteDataSource.getAllImageItems()' on a null object reference at foto.studio.MainActivity.onCreateOptionsMenu(MainActivity.java:267) at android.app.Activity.onCreatePanelMenu(Activity.java:2947) at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:606) at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:980) at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:308) at com.android.internal.policy.impl.PhoneWindow.doPendingInvalidatePanelMenu(PhoneWindow.java:954) at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2194) at android.app.Activity.onRestoreInstanceState(Activity.java:1092) at android.app.Activity.performRestoreInstanceState(Activity.java:1037) at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1175) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666) ... 10 more

最佳答案

在 onCreateOptionsMenu() 中使用自定义代码时要小心:该方法可能会在 onCreate() 之后随时调用,具体取决于 Android 版本和其他因素。当调用该方法时,您的数据源显然尚未准备好,因此您也必须处理这种情况。

我可能建议您在初始化菜单项之前测试数据源是否为空,并且一旦数据源准备好,就初始化菜单项(如果尚未完成)。

关于java - 尝试在空对象引用上调用虚拟方法 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31343482/

相关文章:

javascript - array.filter() 的 JS 函数问题

java - 什么是抽象按钮?

android - 整个屏幕的 onClickListener

c# - 创建一个仅指向另一个数组的一部分的数组?

android - 在android中实现双向 ListView 的正确方法

android - 无法安装 andgram (android instagram)

javascript - 获取 URL 的最后两个参数 - javascript

java - 无法生成 Cloud Endpoint 客户端库 - "Not an App Engine project"

java - 如何将这种过程式编程转换为面向对象编程?

java - 如何在 JSP 中调用 EJB3 session bean?