读取嵌套的Parcelable时崩溃

时间:2012-04-11 19:46:52

标签: android parcelable

我有一个扩展Parcelable的类。它有一个成员变量,它是另一个类的ArrayList,它也扩展了Parcelable。

我将Intent中的MyClass1对象传递回Activity并将其读入。当构造函数到达in.readTypedList时,应用程序崩溃并出现以下错误:

04-11 14:19:11.223: E/AndroidRuntime(502): Uncaught handler: thread main exiting due to uncaught exception
04-11 14:19:11.234: E/AndroidRuntime(502): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { (has extras) }} to activity {com.mypackage.app/com.mypackage.app.activity.MyActivity}: java.lang.NullPointerException
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3329)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3371)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.app.ActivityThread.access$2700(ActivityThread.java:119)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1893)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.os.Looper.loop(Looper.java:123)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.app.ActivityThread.main(ActivityThread.java:4363)
04-11 14:19:11.234: E/AndroidRuntime(502):  at java.lang.reflect.Method.invokeNative(Native Method)
04-11 14:19:11.234: E/AndroidRuntime(502):  at java.lang.reflect.Method.invoke(Method.java:521)
04-11 14:19:11.234: E/AndroidRuntime(502):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-11 14:19:11.234: E/AndroidRuntime(502):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-11 14:19:11.234: E/AndroidRuntime(502):  at dalvik.system.NativeStart.main(Native Method)
04-11 14:19:11.234: E/AndroidRuntime(502): Caused by: java.lang.NullPointerException
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.os.Parcel.readTypedList(Parcel.java:1497)
04-11 14:19:11.234: E/AndroidRuntime(502):  at com.mypackage.app.utils.Strength.<init>(Strength.java:44)
04-11 14:19:11.234: E/AndroidRuntime(502):  at com.mypackage.app.utils.Strength$1.createFromParcel(Strength.java:171)
04-11 14:19:11.234: E/AndroidRuntime(502):  at com.mypackage.app.utils.Strength$1.createFromParcel(Strength.java:1)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.os.Parcel.readParcelable(Parcel.java:1845)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.os.Parcel.readValue(Parcel.java:1713)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.os.Parcel.readMapInternal(Parcel.java:1947)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.os.Bundle.unparcel(Bundle.java:169)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.os.Bundle.containsKey(Bundle.java:210)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.content.Intent.hasExtra(Intent.java:3067)
04-11 14:19:11.234: E/AndroidRuntime(502):  at com.mypackage.app.activity.MyActivity.onActivityResult(MyActivity.java:306)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.app.Activity.dispatchActivityResult(Activity.java:3828)
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3325)
04-11 14:19:11.234: E/AndroidRuntime(502):  ... 11 more  

public class MyClass1 implements Parcelable {

    private int mVar1;
    private int mVar2;
    private int mVar3;
    private long mVar5;
    private long mVar6;
    private String mVar7;
    private String mVar8;
    private String mVar9;
    private String mVar10;
    private ArrayList<MyClass2> mVar11;

    public MyClass1() {
        mVar1 = -1;
        mVar2 = -1;
        mVar3 = -1;
        mVar5 = 0;
        mVar6 = 0;
        mVar7 = null;
        mVar8 = null;
        mVar9 = null;
        mVar10 = null;
        mVar11 = new ArrayList<MyClass2>();
    }

    public MyClass1(Parcel in) {
        mVar1 = in.readInt();
        mVar2 = in.readInt();
        mVar3 = in.readInt();
        mVar5 = in.readLong();
        mVar6 = in.readLong();
        mVar8 = in.readString();
        mVar9 = in.readString();
        mVar10 = in.readString();
        in.readTypedList(mVar11, MyClass2.CREATOR);
        mVar7 = in.readString();
    }

    public int getVar1() {
        return mVar1;
    }

    public void setVar1(int intVar1) {
        this.mVar1 = intVar1;
    }

    public int getVar2() {
        return mVar2;
    }

    public void setVar2(int intVar2) {
        this.mVar2 = intVar2;
    }

    public int getVar3() {
        return mVar3;
    }

    public void setVar3(int intVar3) {
        this.mVar3 = intVar3;
    }

    public long getVar5() {
        return mVar5;
    }

    public void setVar5(long lngVar5) {
        this.mVar5 = lngVar5;
    }

    public long getVar6() {
        return mVar6;
    }

    public void setVar6(long lngVar6) {
        this.mVar6 = lngVar6;
    }

    public String getVar7() {
        return mVar7;
    }

    public void setVar7(String strVar7) {
        this.mVar7 = strVar7;
    }

    public String getVar8() {
        return mVar8;
    }

    public void setVar8(String strVar8) {
        this.mVar8 = strVar8;
    }

    public String getVar9() {
        return mVar9;
    }

    public void setVar9(String strVar9) {
        this.mVar9 = strVar9;
    }

    public String getVar10() {
        return mVar10;
    }

    public void setVar10(String strVar10) {
        this.mVar10 = strVar10;
    }

    public ArrayList<MyClass2> getVar11() {
        return mVar11;
    }

    public void setVar11(ArrayList<MyClass2> aryVar11) {
        this.mVar11 = aryVar11;
    }

    public void addVar11(MyClass2 mc2) {
        this.mVar11.add(mc2);
    }

    public MyClass2 removeVar11(int index) {
        if (index < this.mVar11.size()) {
            return this.mVar11.remove(index);
        }

        return null;
    }

    public static final Parcelable.Creator<MyClass1> CREATOR = new Parcelable.Creator<MyClass1>()
    {
        public MyClass1 createFromParcel(Parcel in) {
            return new MyClass1(in);
        }

        public MyClass1[] newArray (int size) {
            return new MyClass1[size];
        }
    };

    public int describeContents() {
        return 0;
    }

    public void writeToParcel (Parcel dest, int flags) {
        dest.writeInt(mVar1);
        dest.writeInt(mVar2);
        dest.writeInt(mVar3);
        dest.writeLong(mVar5);
        dest.writeLong(mVar6);
        dest.writeString(mVar8);
        dest.writeString(mVar9);
        dest.writeString(mVar10);
        if (mVar11 == null) {
            mVar11 = new ArrayList<MyClass2>();
        }
        dest.writeTypedList(mVar11);
        dest.writeString(mVar7);
    }
}






public class MyClass2 implements Parcelable {

    private int mVar1;
    private int mVar2;
    private String mVar3;
    private String mVar4;

    public MyClass2() {
        mVar1 = -1;
        mVar2 = -1;
        mVar3 = null;
        mVar4 = null;
    }

    public MyClass2(Parcel in) {
        mVar1 = in.readInt();
        mVar2 = in.readInt();
        mVar3 = in.readString();
        mVar4 = in.readString();
    }

    public int getVar1() {
        return mVar1;
    }

    public void setVar1(int intVar1) {
        this.mVar1 = intVar1;
    }

    public int getVar2() {
        return mVar2;
    }

    public void setVar2(int intVar2) {
        this.mVar2 = intVar2;
    }

    public String getVar3() {
        return mVar3;
    }

    public void setVar3(String strVar3) {
        this.mVar3 = strVar3;
    }

    public String getVar4() {
        return mVar4;
    }

    public void setVar4(String strVar4) {
        this.mVar4 = strVar4;
    }

    public static final Parcelable.Creator<MyClass2> CREATOR = new Parcelable.Creator<MyClass2>()
    {
        public MyClass2 createFromParcel(Parcel in) {
            return new MyClass2(in);
        }

        public MyClass2[] newArray (int size) {
            return new MyClass2[size];
        }
    };

    public int describeContents() {
        return 0;
    }

    public void writeToParcel (Parcel dest, int flags) {
        dest.writeInt(mVar1);
        dest.writeInt(mVar2);
        dest.writeString(mVar3);
        dest.writeString(mVar4);
    }
}

我已经梳理了这个,看不到任何东西,这意味着我可能没有注意到它真的很蠢。

想法?

1 个答案:

答案 0 :(得分:10)

04-11 14:19:11.234: E/AndroidRuntime(502): Caused by: java.lang.NullPointerException
04-11 14:19:11.234: E/AndroidRuntime(502):  at android.os.Parcel.readTypedList(Parcel.java:1497)

查看源代码(Parcel.java:1497):

public final <T> void readTypedList(List<T> list, Parcelable.Creator<T> c) {
  int M = list.size();  // line 1497
  ... ...

的ArrayList&LT; MyClass2&GT;在调用Parcel.readTypedList();

之前,mVar11尚未正确初始化
public MyClass1(Parcel in) {
  mVar1 = in.readInt();
  mVar2 = in.readInt();
  mVar3 = in.readInt();
  mVar5 = in.readLong();
  mVar6 = in.readLong();
  mVar8 = in.readString();
  mVar9 = in.readString();
  mVar10 = in.readString();
  mVar11 = new ArrayList<MyClass2>();
  in.readTypedList(mVar11, MyClass2.CREATOR);
  mVar7 = in.readString();
}

这应该可以解决您的NullPointerException错误。