如何初始化,我得到NullPointer异常

时间:2014-04-21 07:15:06

标签: android dialog nullpointerexception

在我的主文件中,private class MyDiary我设置了OnItemLongClickListener,如下所示:

ListView list = getListView();
        list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    new EditListItemDialog(view.getContext()).show();

                return true;       
            }
        });

然后,在EditListItemDialog文件中,我尝试向行表中添加新值(表格显示在上一个文件中):

@Override
public void onClick(View v) {
    fragment_monday.add(((TextView) v).getText().toString());//here is your updated(or not updated) text
    dismiss();
}

fragment_monday是我的第一个使用列表视图的文件的xml:

<LinearLayout
                    android:id="@+id/linearLayout3"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentTop="true"
                    android:padding="0dp" >



                    <RelativeLayout
                        android:id="@+id/relativeLayout4"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1" >

                         <ListView
    android:layout_width="fill_parent"
                    android:gravity="center"
    android:layout_height="fill_parent"
    android:id="@android:id/list"
    android:longClickable="true"
     >

</ListView>



             </RelativeLayout>



                </LinearLayout>

最后,当我点击EditListItemDialog中的确认按钮更改数据时,应用程序崩溃,我在第37行获得NullPointer Exception,这是第二行,第3行。 我猜测fragment_monda y设置不正确,但我真的不知道如何处理它以使这件事有效。 有人可以帮忙吗?

这是LogCat输出:

04-21 09:18:53.009: E/AndroidRuntime(5483): FATAL EXCEPTION: main
04-21 09:18:53.009: E/AndroidRuntime(5483): java.lang.NullPointerException
04-21 09:18:53.009: E/AndroidRuntime(5483):     at com.example.classorganizer.EditListItemDialog.onClick(EditListItemDialog.java:37)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at android.view.View.performClick(View.java:2485)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at android.view.View$PerformClick.run(View.java:9080)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at android.os.Handler.handleCallback(Handler.java:587)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at android.os.Looper.loop(Looper.java:130)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at android.app.ActivityThread.main(ActivityThread.java:3687)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at java.lang.reflect.Method.invokeNative(Native Method)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at java.lang.reflect.Method.invoke(Method.java:507)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
04-21 09:18:53.009: E/AndroidRuntime(5483):     at dalvik.system.NativeStart.main(Native Method)

我还尝试将私有类MyDiary中的第一段代码移动到私有类MyAdapter扩展BaseAdapter但没有变化。

EditListItemDialog的完整代码:

package com.example.classorganizer;

import java.util.List;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

class EditListItemDialog extends Dialog implements View.OnClickListener {

private View editText;

public EditListItemDialog(Context context) {
    super(context);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.edit_text_dialog);//here is your xml with EditText and 'Ok' and 'Cancel' buttons
    View btnOk = findViewById(R.id.button_ok);
    editText = findViewById(R.id.edit_text);
    btnOk.setOnClickListener(this);
}

private List<String> fragment_monday;

public EditListItemDialog(Context context, List<String> fragment_monday) {
    super(context);
    this.fragment_monday = fragment_monday;
}

@Override
public void onClick(View v) {
    fragment_monday.add(((TextView) v).getText().toString());//here is your updated(or not updated) text
    dismiss();
}
}

2 个答案:

答案 0 :(得分:0)

EditListItemDialog中有两个构造函数,其中只有另一个构造函数初始化fragment_monday。在您的onItemLongClick()代码中,您使用的是不初始化该变量的1-arg构造函数。 onClick()使用fragment_monday,这是你的NPE。

要修复它,要么

  • 删除1-arg构造函数并仅使用2-arg构造函数,或

  • fragment_monda初始化为1-arg构造函数中的合理默认值。

答案 1 :(得分:0)

据我所知,你有两个EditListItemDialog构造函数。一个是fragment_monday而另一个没有它。因此,如果在第一个构造函数的帮助下创建对象,则fragment_monday等于null。

只需替换

public EditListItemDialog(Context context) {
    super(context);
}

有了这个

public EditListItemDialog(Context context) {
    super(context);
    this.fragment_monday = new  List<String>();
}

我不知道是否一切都会好,但它会阻止Null Pointer Exception;