NullPointerException при вызове закрытой конечной переменной в методе - PullRequest
1 голос
/ 25 декабря 2011

Я создаю private ArrayList<String> values;.values присваивается значение в методе onCreate (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;
}

Пожалуйста, скажите мне, если вам нужна дополнительная информация (хотя я сомневаюсь в этом), и заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 25 декабря 2011

В строке 23 значения объявлены как локальная переменная (отличается от вашей переменной экземпляра). Вместо этого измените строку 66 на private final ArrayList<String> values; и строку 23 на values = new ArrayList<String>();

Java позволяет локальным переменным и переменным экземпляра иметь одинаковые имена. В этом случае он использует локальную переменную для операций, поэтому вы не получите ошибку в onCreate, но позже эта переменная выходит за рамки (и переменной экземпляра все еще не было присвоено значение).

1 голос
/ 26 декабря 2011

values, который вы используете в строке №. 55 - это переменная экземпляра, тип которой вы определили в строке №. 66 (и вы находитесь под впечатлением от использования ссылочной переменной строки номер 23), которая по умолчанию имеет значение null. Так что бросали NullPointerException.

0 голосов
/ 26 декабря 2011

Проще говоря, сделайте своего ArrayList членом класса. Конечно, это уже член класса, создайте его экземпляр там, где он объявлен. Замените свой номер строки 66 следующим утверждением и используйте его, как и когда это требуется, из приложения.

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

Вы объявляете ArrayList дважды в своем приложении один раз как член класса и снова как локальную переменную. В этой ситуации локальная переменная имеет более высокий приоритет, чем член класса.

0 голосов
/ 25 декабря 2011

У вас есть два значения ArrayList. Одно из них локальное, которое находится в методе oncreate. Другое - это уровень класса, и ему никогда не присваивается значение. Установка значений уровня класса.

private Button addUser;частные значения ArrayList;частный адаптер ArrayAdapter;

...