【问题标题】:NullPointerException when calling a private final variable in a method在方法中调用私有最终变量时出现 NullPointerException
【发布时间】:2011-12-25 19:46:31
【问题描述】:

我创建private ArrayList<String> values;。在 onCreate 方法 (final ArrayList<String> values = new ArrayList<String>();) 中为 values 分配了一个值。另一种方法onOptionsItemSelected 尝试使用values,但随后出现NullPointerException

全班都是here,如果我的解释难以理解,请见谅。异常发生在第 55 行。

package org.sandholm.max.MCFriendsList;

import java.util.ArrayList;

import android.app.ListActivity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ArrayAdapter;

public class MCFriendsListActivity extends ListActivity {
    /** Called when the activity is first created. */
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listactivity);
        final ArrayList<String> values = new ArrayList<String>();
        setListAdapter(new ArrayAdapter<String>(this, R.layout.listactivity, values));
                final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1, values);
                setListAdapter(adapter);
        addUser = (Button) findViewById(R.id.button1);
        addUser.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                        values.add("vurp0");
                        adapter.notifyDataSetChanged();
                }
        });
    }
        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
                String item = (String) getListAdapter().getItem(position);
                Intent i = new Intent(v.getContext(), MCFriendsInfoActivity.class);
                i.putExtra("uname", item);
                v.getContext().startActivity(i);
    }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu, menu);
            return true;
        }
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle item selection
            switch (item.getItemId()) {
            case R.id.item1:
                        values.add("vurp0");
                adapter.notifyDataSetChanged();
                return true;
            case R.id.item2:
                //showHelp();
                return true;
            default:
                return super.onOptionsItemSelected(item);
            }
        }
        private Button addUser;
        private ArrayList<String> values;
        private ArrayAdapter<String> adapter;
}

如果您需要更多信息(尽管我对此表示怀疑),请告诉我,并提前致谢。

【问题讨论】:

    标签: java android nullpointerexception private


    【解决方案1】:

    第 23 行的值声明为局部变量(不同于您的实例变量)。相反,将第 66 行更改为 private final ArrayList&lt;String&gt; values;,将第 23 行更改为 values = new ArrayList&lt;String&gt;();

    Java 允许局部变量和实例变量具有相同的名称。在这种情况下,它使用局部变量进行操作,因此您在 onCreate 中不会出错,但后来该变量超出范围(并且实例变量仍未被赋值)。

    【讨论】:

    • 谢谢,这是有效的。我想编写我认为有效的代码并根据 Eclipse 的提示进行更正并不总是有效... ;)
    【解决方案2】:

    values 您在第 1 行使用。 55 是一个实例变量,您在第 1 行定义了它的数据类型。 66(并且您对使用第 23 行引用变量的印象)默认设置为 null。所以抛出NullPointerException

    【讨论】:

      【解决方案3】:

      您有两个 ArrayList 值。其中一个是本地的,位于 oncreate 方法中。另一个是类级别,它从未分配过值。设置类级别的值。

      私人按钮 addUser; 私有 ArrayList 值; 私有 ArrayAdapter 适配器;

      【讨论】:

        【解决方案4】:

        最好让你的ArrayList 成为班级成员。当然,它已经是一个类成员,在它声明的地方实例化它。将您的行号 66 替换为以下语句,并在整个应用程序需要时使用它。

        private final ArrayList<String> values = new ArrayList<String>();
        

        您在应用程序中将ArrayList 两次声明为类成员,然后再次声明为局部变量。在这种情况下,局部变量享有比类成员更高的优先级。

        【讨论】:

          猜你喜欢
          • 2018-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-01
          • 2014-03-19
          • 2017-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多