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



创建private ArrayList<String> values;valuesonCreate方法(final ArrayList<String> values = new ArrayList<String>();)中被赋值。另一个方法onOptionsItemSelected试图使用values,但随后发生了NullPointerException

全班都来了,如果我的解释让你难以理解,我很抱歉。异常出现在第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;
}

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

在第23行values 被声明为作为一个局部变量(不同于您的实例变量)。相反,将第66行改为private final ArrayList<String> values;,第23行改为values = new ArrayList<String>();

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

values。55是一个实例变量,您已经在第5行定义了它的数据类型。66(您印象中使用的是第23行引用变量),默认设置为null。所以扔NullPointerException

你有两个数组列表值,其中一个是本地的,它在oncreate方法中。另一个是类级别,它从未赋值。设置类级别值

private Button addUser;private ArrayList的值;

更确切地说,让您的ArrayList成为类成员。当然,它已经是一个类成员,在声明它的地方实例化它。用下面的语句替换行号66,并在整个应用程序中需要时使用它。

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

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

最新更新