2011-12-25 55 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