我怎样才能修复我的空指针异常

时间:2015-09-04 13:05:03

标签: android

我一直试图修复这个空指针异常,但我不能。我知道它指向一个空对象,但我不知道如何解决它。我是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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在OnCreateView()中添加适配器并在添加任何值之前

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

这里的taskNames可以是任务名称的数组或数组列表,您可以将其定义为

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

让我知道它是否适合你...

并将其标记为答案,以便对其他人有用......

答案 3 :(得分:0)

当您尝试在其上调用ArrayAdapter方法时,您尚未为itemsAdapter变量创建add()的实例。

尝试使用以下方法初始化它:

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

注意:valuesString[]List<String>,因此您需要正确传递

答案 4 :(得分:0)

我想你应该试试这个..!

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