2012-04-11 6 views
2

У меня есть класс, который расширяет Parcelable. Он имеет переменную-член, которая является ArrayList другого класса, который также расширяет Parcelable.Сбой при чтении вложенных Parcelable

Я передать объект MyClass1 в Intent назад к деятельности и читать его в Когда конструктор достигает 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); 
    } 
} 

Я прочел это и ничего не вижу, а это значит, что это, наверное, что-то действительно глупое, что я не замечаю.

Идеи?

+0

Возможно ли, что при запуске сериализации этот список равен нулю, а десериализация не учитывает это? –

+0

Нет. На самом деле я не включил его, но перед записью типизированного списка у меня есть чек для null. Если mSet имеет значение null, я инициализирую его до пустого ArrayList. – Andrew

+0

Это кажется действительно странным, можете ли вы разместить свои объекты? –

ответ

9
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 MyClass2 > mVar11 не была должным образом инициализирована перед вызовом Parcel.readTypedList();

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.

+2

Я подумал об этом, но я посмотрел на другую пару классов, где я делаю то же самое. Я не инициализирую массив перед вызовом readTypedList, и он никогда не разбивался обо мне. Я проверю это и посмотрю, получу ли я свои данные. – Andrew

+0

Хм, кажется, работает. благодаря – Andrew

Смежные вопросы