【问题标题】:Null pointer exception when calling method from a different class从不同的类调用方法时出现空指针异常
【发布时间】:2015-10-21 09:26:03
【问题描述】:

当我尝试从另一个类调用方法loadUserList() 时,我收到以下错误:

Attempt to invoke virtual method android.content.res.Resources 
android.content.Context.getResources() on a null object reference

这是我的 loadUserList 方法

public void loadUserList()
{
    final ProgressDialog dia = ProgressDialog.show(this, null, getString(R.string.alert_loading));

    ParseQuery<ParseObject> query = ParseQuery.getQuery("Chat_User");
    query.whereEqualTo("receiver", ParseUser.getCurrentUser());
    query.include("sender");

    query.findInBackground(new FindCallback<ParseObject>()
    {

        @Override
        public void done(List<ParseObject> li, ParseException e)
        {
            dia.dismiss();

            if (li != null)
            {
                if (li.size() == 0)
                    Toast.makeText(com.yarnyard.UserList.this, R.string.msg_no_user_found,
                            Toast.LENGTH_SHORT).show();

                uList = new ArrayList<ParseObject>(li);
                ListView list = (ListView) findViewById(R.id.list);
                list.setAdapter(new UserAdapter());
                list.setOnItemClickListener(new OnItemClickListener()
                {
                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3)
                    {
                        loadUserList();
                        /*startActivity(new Intent(com.yarnyard.UserList.this, Chat.class)
                                .putExtra(Const.EXTRA_DATA, uList.get(pos).getUsername()));*/
                    }
                });
            }
            else
            {
                Utils.showDialog(
                        com.yarnyard.UserList.this,
                        getString(R.string.err_users) + " "
                                + e.getMessage());
                e.printStackTrace();
            }
        }
    });
}

我是这样称呼它的

public void done(ParseException e)
{
    UserList UserList = new UserList();
    UserList.loadUserList();
}

我的错误日志

07-30 14:14:56.219  13383-13383/com.anonimv2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.anonimv2, PID: 13383
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
        at android.content.ContextWrapper.getResources(ContextWrapper.java:85)
        at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:74)
        at android.content.Context.getString(Context.java:376)
        at com.yarnyard.UserList.loadUserList(UserList.java:96)
        at com.yarnyard.custom.CustomActivity.onOptionsItemSelected(CustomActivity.java:116)
        at android.app.Activity.onMenuItemSelected(Activity.java:2882)
        at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:353)
        at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1131)
        at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761)
        at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
        at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904)
        at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
        at android.widget.ActionMenuView.invokeItem(ActionMenuView.java:587)
        at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:141)
        at android.view.View.performClick(View.java:4832)
        at android.view.View$PerformClick.run(View.java:19839)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:211)
        at android.app.ActivityThread.main(ActivityThread.java:5321)
        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:1016)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)

任何建议将不胜感激。

【问题讨论】:

  • 您的代码与您发布的 logcat 不匹配。所以先把它做好。

标签: java android nullpointerexception


【解决方案1】:

在对象上调用普通的非静态方法,而不是在类上。这是您在使用面向对象语言之前真正需要学习的一个要点。只有这样,您才能在实践中看到如何通过传递引用来连接对象。

您在done 方法中构造的UserList 对象不是您要调用的对象,它只是一个空的、未初始化的shell。

【讨论】:

  • 这很令人困惑,但看起来它实际上是在一个对象实例上调用的,但实例引用与类的名称相同。 OPs 代码在很多层面上都是错误的......
  • @DanielNugent 是的,我注意到它是在实例上调用的 - 我试图说它是在调用之前创建的实例,而不是 OP 想要调用的实例(也就是说,从堆栈跟踪,当前活动)。
【解决方案2】:

据我了解,您是从 Context 扩展 UserList 的,对吗?
然后请记住,在 Android 中,永远不要自己初始化 Context 对象,这是框架的工作。
在你的情况下,因为你创建了一个没有附加到任何 baseContext 的上下文实例,所以当访问公共资源时,你得到了一个 NPE。
我猜你正试图转移到一个新的片段或活动?然后阅读这些链接start activityswitch fragment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多