2011-12-25 59 views
1

我创建private ArrayList<String> values;。在onCreate方法(final ArrayList<String> values = new ArrayList<String>();)中为values分配了一个值。另一种方法onOptionsItemSelected尝试使用values,但后来发生NullPointerException在方法中调用私有最终变量时出现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; 
} 

请告诉我,如果你需要更多的信息(尽管我对此表示怀疑),并感谢发生的异常。

回答

3

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

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

+0

谢谢,这是什么工作。我想编写代码,我假设工作,并根据Eclipse的技巧纠正它并不总是工作...;) – vurp0 2011-12-25 20:03:24

+3

太棒了!请记住标记回答您的问题为接受:)。 – 2011-12-25 20:05:27

0

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

private Button addUser; private ArrayList values; 私有ArrayAdapter适配器;

0

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

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

你在你的应用程序宣布ArrayList两次一次作为一个类的成员,并再次为局部变量。在这种情况下,局部变量享有比类成员更高的优先级。

1

values你正在使用的线路号码。 55是一个实例变量,它已在第no行定义了它的数据类型。 66(您使用的是第23行参考变量),默认设置为空。所以扔NullPointerException