2015-09-04 61 views
1

我一直在試圖解決這個空指針異常,但我不能。我知道它指向一個空對象,但我不知道如何解決它。我是Java編程的初學者,所以如果這是一個愚蠢的問題,請不要生氣。我如何解決我的空指針異常

這裏是我的代碼:

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 



public class MainActivity extends Activity { 

    public ArrayAdapter<String> itemsAdapter; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //EditText 
     final EditText etTask = (EditText) findViewById(R.id.editText); 
     final String Task = etTask.getText().toString(); 

     //Button 
     Button btn = (Button) findViewById(R.id.button); 

     //Null Fix 

     //OnClickListeners 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       itemsAdapter.add(Task); 
       etTask.setText(""); 

      } 
     }); 

    } 

} 

這裏是我的logcat:

09-04 06:58:32.704 16735-16735/com.example.elias.doit E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.elias.doit, PID: 16735 
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ArrayAdapter.add(java.lang.Object)' on a null object reference 
      at com.example.elias.doit.MainActivity$1.onClick(MainActivity.java:38) 
      at android.view.View.performClick(View.java:4780) 
      at android.view.View$PerformClick.run(View.java:19866) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
09-04 06:58:40.564 16735-16735/? I/Process﹕ Sending signal. PID: 16735 SIG: 9 
+2

刪除'itemsAdapter.add(任務);' – Blackbelt

+0

是什麼'Task'這裏'itemsAdapter.add(任務);' – Rustam

+0

Initilaize您通過 itemsAdapter =新ArrayAdapter (這一點, 機器人itemsAdapter適配器。 R.layout.simple_list_item_1,values); –

回答

2

itemsAdapter永遠不會初始化。它根本沒有價值。這就是爲什麼當你打電話給你的add()時,你會得到一個NullPointerException

試着這樣做:

ArrayList<String> data = new ArrayList<>(); 

// add some data to your ArrayList. 

itemsAdapter = new ArrayAdapter<String>(this, 
android.R.layout.simple_list_item_1, data); 

你也可以使用一個String[]陣列代替ArrayList<String>或任何其他List<String>爲此事的。


在你的代碼應該是這樣的:

private ArrayAdapter<String> itemsAdapter; 
private ArrayList<String> data; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //EditText 
    final EditText etTask = (EditText) findViewById(R.id.editText); 
    final String task = etTask.getText().toString(); 

    data = new ArrayList<>(); 

    itemsAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, data); 

    //Button 
    Button btn = (Button) findViewById(R.id.button); 



    //OnClickListeners 
    btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      data.add(task); 
      itemsAdapter.notifyDataSetChanged(); 
      etTask.setText(""); 

     } 
    }); 

編輯:如果你創建ArrayAdapter到像一個ListView使用。你的代碼在哪裏?我想你也忘了明白了。

喜歡的東西:

ListView lv = (ListView) findViewById(R.id.yourListView); 
// initialize the adapter and stuff. 
lv.setAdapter(itemsAdapter); 

有關ListView和適配器進一步閱讀,看看this linkthis tutorial。另外,請檢查the docs

+0

downvote的原因是什麼? – Mauker

+0

這不是'ArrayList' –

+0

我的不好。想到創建一個在適配器中使用的列表呵呵。 – Mauker

1

初始化適配器itemsAdapter=new ArrayAdapter<>(...);

+0

我應該把什麼放在...... – Dale

+0

這取決於你的要求。有多個實現。 – Rustam

+0

@Dale你的情況下'ArrayAdapter'的用途是什麼? – Rustam

0

你還沒有爲你的itemsAdapter變量,創建一個ArrayAdapter的情況下,當你試圖調用add()方法就可以了。

嘗試使用其初始化:

itemsAdapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_1, values); 

注:values要麼是String[]List<String>所以你需要通過在正確

1

初始化您在OnCreateView(適配器),並加入前任何值,

itemsAdapter = new ArrayAdapter<String>(this, 
     android.R.layout.simple_list_item_1, taskNames); 

這裏taskNames可以是你定義的任務名稱的數組或數組列表如,

ArrayList<String> taskNames; // or String[] taskNames; 

讓我知道它是否適合你...

,並做標記爲答案這樣,這將是有用的人......

0

我想你應該試試這個..!

ArrayList<MyClass> myList = new ArrayList<MyClass>(); 
    ArrayAdapter<MyClass> adapter = new ArrayAdapter<MyClass>(this, R.layout.row, 
    to, myList.); 
listView.setAdapter(adapter);