在方法中调用私有final变量时出现NullPointerException

时间:2011-12-25 19:46:31

标签: java android nullpointerexception private

我创建了private ArrayList<String> values;。在values方法(onCreate)中为final ArrayList<String> values = new ArrayList<String>();分配了一个值。另一种方法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;
}

请告诉我您是否需要更多信息(虽然我对此表示怀疑)并提前感谢。

4 个答案:

答案 0 :(得分:3)

在第23行,值声明作为局部变量(与实例变量不同)。相反,请将第66行更改为private final ArrayList<String> values;,将第23行更改为values = new ArrayList<String>();

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

答案 1 :(得分:1)

您在第5行使用的

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

答案 2 :(得分:0)

你有两个ArrayList值。其中一个是oncreate metod中的local。其中一个是类级别,它从未赋值。设置类级别值。

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

答案 3 :(得分:0)

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

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

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