2013-03-15 36 views
14

固定:ANSWER AT BOTTOMClassNotFoundException的時候,真不知道爲什麼

我寫一個Android應用程序的項目,我嘗試使用parcelable對象。 我有2個可分類的類。第一個是隻有2個參數的普通類。 第二個是具有附加屬性的類以及第一個類中的類型列表和它的附加對象。

每次我嘗試第二類的一個對象傳遞到另一個活動,我得到android.os.BadParcelableException:ClassNotFoundException的解組

時和應用程序關閉。

我搜索了幾個小時,並嘗試了多種解決方案,但沒有任何幫助。 的錯誤犯規來時,我只有通過第一類的對象到另一個活動..

這裏我的代碼:

package de.softwareproject.v3.testclasses; 

import android.os.Parcel; 
import android.os.Parcelable; 

public class Cart implements Parcelable { 

private String name; 
private Integer priceInCents; 

public Cart() {} 

public Cart(Parcel in){ 
    readFromParcel(in); 
} 

public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public Integer getPriceInCents() { 
    return priceInCents; 
} 
public void setPriceInCents(Integer priceInCents) { 
    this.priceInCents = priceInCents; 
} 

public static final Parcelable.Creator<Cart> CREATOR = new Parcelable.Creator<Cart>() { 

      @Override 
      public Cart createFromParcel(Parcel source) { 
       return new Cart(source); 
      } 

      @Override 
      public Cart[] newArray(int size) { 
       return new Cart[size]; 
      } 
}; 

@Override 
public int describeContents() { 
    // TODO Auto-generated method stub 
    return 0; 
} 
@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(name); 
    dest.writeInt(priceInCents); 
} 

private void readFromParcel(Parcel in) { 
    name = in.readString(); 
    priceInCents = in.readInt(); 
} 
} 

我的第二類:

package de.softwareproject.v3.testclasses; 

import java.util.ArrayList; 
import java.util.List; 
import android.os.Parcel; 
import android.os.Parcelable; 

public class CurrentUser implements Parcelable { 

private String username; 
private String eMail; 
private String password; 
private List<Cart> carts; 
private Cart activeCart; 

public CurrentUser() {} 

public CurrentUser(Parcel in) { 
    readFromParcel(in); 
} 

private void readFromParcel(Parcel in) { 
    username = in.readString(); 
    eMail = in.readString(); 
    password = in.readString(); 
    activeCart = in.readParcelable(de.softwareproject.v3.testclasses.Cart.class.getClassLoader()); 
    if (carts == null){ carts = new ArrayList<Cart>(); } 
    in.readTypedList(carts, Cart.CREATOR); 
} 

public String getUsername() { 
    return username; 
} 
public void setUsername(String username) { 
    this.username = username; 
} 
public String geteMail() { 
    return eMail; 
} 
public void seteMail(String eMail) { 
    this.eMail = eMail; 
} 
public String getPassword() { 
    return password; 
} 
public void setPassword(String password) { 
    this.password = password; 
} 
public List<Cart> getCarts() { 
    return carts; 
} 
public void setCarts(List<Cart> carts) { 
    this.carts = carts; 
} 
public Cart getActiveCart() { 
    return activeCart; 
} 
public void setActiveCart(Cart activeCart) { 
    this.activeCart = activeCart; 
} 

@Override 
public int describeContents() { 
    // TODO Auto-generated method stub 
    return 0; 
} 
@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(username); 
    dest.writeString(eMail); 
    dest.writeString(password); 
    dest.writeTypedList(carts); 
    dest.writeParcelable(activeCart, flags); 
} 

public static final Parcelable.Creator<CurrentUser> CREATOR = new Parcelable.Creator<CurrentUser>() { 

    @Override 
    public CurrentUser createFromParcel(Parcel in) { 
     return new CurrentUser(in); 
    } 

    @Override 
    public CurrentUser[] newArray(int size) { 
     return new CurrentUser[size]; 
    } 
}; 
} 

請幫助我。

編輯:這裏我logcat的

03-15 16:24:08.139: E/Parcel(689): Class not found when unmarshalling: ??, e: java.lang.ClassNotFoundException: ?? 
    03-15 16:24:08.149: D/AndroidRuntime(689): Shutting down VM 
    03-15 16:24:08.149: W/dalvikvm(689): threadid=1: thread exiting with uncaught exception (group=0x409961f8) 
    03-15 16:24:08.229: E/AndroidRuntime(689): FATAL EXCEPTION: main 
    03-15 16:24:08.229: E/AndroidRuntime(689): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.softwareproject.v3/de.softwareproject.v3.Startpage}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: ?? 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.access$600(ActivityThread.java:122) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Handler.dispatchMessage(Handler.java:99) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Looper.loop(Looper.java:137) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.main(ActivityThread.java:4340) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at java.lang.reflect.Method.invokeNative(Native Method) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at java.lang.reflect.Method.invoke(Method.java:511) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at dalvik.system.NativeStart.main(Native Method) 
    03-15 16:24:08.229: E/AndroidRuntime(689): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: ?? 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Parcel.readParcelable(Parcel.java:1966) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.testclasses.CurrentUser.readFromParcel(CurrentUser.java:26) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.testclasses.CurrentUser.<init>(CurrentUser.java:19) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.testclasses.CurrentUser$1.createFromParcel(CurrentUser.java:80) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.testclasses.CurrentUser$1.createFromParcel(CurrentUser.java:1) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Parcel.readParcelable(Parcel.java:1992) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Parcel.readValue(Parcel.java:1854) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Parcel.readMapInternal(Parcel.java:2094) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Bundle.unparcel(Bundle.java:223) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.os.Bundle.getParcelable(Bundle.java:1158) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at de.softwareproject.v3.Startpage.onCreate(Startpage.java:34) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.Activity.performCreate(Activity.java:4465) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
    03-15 16:24:08.229: E/AndroidRuntime(689): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
    03-15 16:24:08.229: E/AndroidRuntime(689): ... 11 more 
    03-15 16:24:10.289: I/Process(689): Sending signal. PID: 689 SIG: 9 

FIX 我終於找到了錯誤,我只是不能再用相信的它!

搜索了將近1/2天,它所需要的只是切換readFromParcel或writeToParcel中的最後兩個方法,因爲它們不是完全相同的順序!

不能相信它,但現在它工作。 對於每個出現同樣錯誤的人,請檢查writeToParcel和readFromParcel的順序。 Thay必須以相同的順序。

有一個愉快的一天,基督教**

+0

發佈你的logcat,看看你到底在哪裏得到異常。 – DigCamara 2013-03-15 16:20:17

+0

我做過了,希望你能讀到 – 2013-03-15 16:33:01

+0

你有沒有證明你輸入的有效性? – MemLeak 2013-03-15 16:35:19

回答

27

FIX我終於找到了錯誤,我只是不能再用相信的它!

搜索了將近1/2天,它所需要的只是切換readFromParcel或writeToParcel中的最後兩個方法,因爲它們不是完全相同的順序!

不能相信它,但現在它工作。對於每個出現相同錯誤的人,請檢查writeToParcel和readFromParcel的順序。 Thay必須以相同的順序。

(基督教RISCH解決它的自己。不過,我相信,在整潔的這個網站。也許他會關閉答案本人)

+0

只是死在那個笑!爆笑!這是對SOF的一個幽默衝擊;意外! – sud007 2016-09-29 13:37:45

+0

哈哈,我沒看見那個:) :)) – mohnage7 2017-10-23 11:06:30

0

@覆蓋 公共無效writeToParcel(包裹DEST,詮釋標誌){ //可以選擇先捆綁...

dest.writeString(songs_id); 
    dest.writeInt(check_song_favorite); 
    dest.writeString(name); 
    dest.writeString(track_image); 
    dest.writeString(created_date); 
    dest.writeString(status); 
    dest.writeString(track); 
    dest.writeString(artist_name); 
    dest.writeString(uploader_name); 
    dest.writeString(play_count); 
    dest.writeString(share_count); 
    dest.writeString(favorite_count); 
    dest.writeString(genre); 
    dest.writeString(user_id); 
    dest.writeString(offline_download); 
    dest.writeString(slug); 
} 

/** 
* Creates ArtistParcelable model from Parcel. 
*/ 
public static final Parcelable.Creator<PlayerData> CREATOR = new Creator<PlayerData>() { 
    @Override 
    public PlayerData createFromParcel(Parcel source) { 
     String songs_id = source.readString(); 
     int check_song_favorite = source.readInt(); 
     String name = source.readString(); 
     String track_image = source.readString(); 
     String created_date = source.readString(); 
     String status = source.readString(); 
     String track = source.readString(); 
     String artist_name = source.readString(); 
     String uploader_name = source.readString(); 
     String play_count = source.readString(); 
     String share_count = source.readString(); 
     String favorite_count = source.readString(); 
     String genre = source.readString(); 
     String user_id = source.readString(); 
     String offline_download = source.readString(); 
     String slug = source.readString(); 

     return new PlayerData(check_song_favorite,songs_id, name, created_date, track_image, status, track, 
       artist_name, uploader_name, play_count, share_count, favorite_count,genre,user_id,offline_download,slug); 
    } 

    @Override 
    public PlayerData[] newArray(int size) { 
     return new PlayerData[size]; 
    } 
}; 

嘗試以相同的方式管理writeToParcel和readFromParcel。解決了我的問題。

相關問題