我创建了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;
}
请告诉我您是否需要更多信息(虽然我对此表示怀疑)并提前感谢。
答案 0 :(得分:3)
在第23行,值声明作为局部变量(与实例变量不同)。相反,请将第66行更改为private final ArrayList<String> values;
,将第23行更改为values = new ArrayList<String>();
Java允许局部变量和实例变量具有相同的名称。在这种情况下,它使用局部变量进行操作,因此onCreate
中没有错误,但稍后变量超出范围(并且实例变量仍未分配值)。
答案 1 :(得分:1)
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
两次声明为类成员,并再次声明为局部变量。在这种情况下,局部变量的优先级高于类成员。