2014-09-22 3 views
0

나는 하나의 클래스를 parcellable로 만들려고 노력하고 있지만, Joda Time Period 객체를 직렬화 가능한 것으로 읽는 동안 NPE가 던져진다.Joda 시간과 LocalDate를 소포에 넣으시겠습니까?

코드 :

private Event(Parcel in) { 
    this.id = in.readLong(); 
    this.scheduleId = in.readLong(); 
    this.entryId = in.readLong(); 
    this.time = (Period) in.readSerializable(); // NPE in this line. 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel out, int flags) { 
    out.writeLong(id); 
    out.writeLong(scheduleId); 
    out.writeLong(entryId); 
    out.writeSerializable(time); 
} 

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

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

로그 캣 :

09-22 22:48:47.929 32708-32708/com.vibhinna.cubs E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.vibhinna.cubs, PID: 32708 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.vibhinna.cubs/com.vibhinna.cubs.ui.EventActivity}: java.lang.NullPointerException 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
      ..... 
    Caused by: java.lang.NullPointerException 
      at java.io.ByteArrayInputStream.<init>(ByteArrayInputStream.java:60) 
      at android.os.Parcel.readSerializable(Parcel.java:2210) 
      at com.vibhinna.cubs.engine.Event.<init>(Event.java:110) 
      at com.vibhinna.cubs.engine.Event.<init>(Event.java:10) 
      at com.vibhinna.cubs.engine.Event$1.createFromParcel(Event.java:251) 
      at com.vibhinna.cubs.engine.Event$1.createFromParcel(Event.java:249) 
      at android.os.Parcel.readParcelable(Parcel.java:2104) 
      at android.os.Parcel.readValue(Parcel.java:2013) 
      ...... 

이 원인이 무엇 내가 그것을 어떻게 해결할 수 있습니다?

답변

1

Parcel에 쓸 때 time 개체가 null이고 나중에 개체를 언 마샬링 할 때 나타납니다. ParcelByteArrayInputStream을 초기화하려고하면 java.io.ByteArrayInputStream.<init>(ByteArrayInputStream.java:60) 줄에서 말할 수 있습니다.

시간 개체가 소포에 쓸 때 null이 아닌지 확인하십시오. Alternatively을 각각 사용하고 null? implements Serializable을 객체로 허용한다는 문서에 따르면 각각 parcel.writeValue(time);readValue()을 사용합니다.

+0

NPE는 이전에 행에서 수행 한 createTypedArray의 일부 인공물 때문이었습니다. 죄송합니다. Period 객체를 작성하고 읽는 것과 관련하여이 코드를 게시하지 않았으므로 방금 time.toString()을 수행했습니다. 그것을 ISO8601 형식 문자열로 변환하고,'new period (in.readstring()) '을 사용하여 다시 변환 할 수 있습니다. 이것이 가장 효율적인 방법이라고 생각합니다. –