【问题标题】:Why am i getting a ClassNotFoundException when reading from a parcelablearray?为什么从 parcelablearray 读取时会出现 ClassNotFoundException?
【发布时间】:2021-11-06 11:44:17
【问题描述】:

第一次问东西。 现在我正在尝试将 HashSet 发送到另一个活动。

所以我做的是这样的:

  1. 我使物品可包裹。它只是一个包含字符串的类,因此不包括打包和解包包裹的方法。

  2. 我使 ItemList 可打包。它是一个包含一个 HashSet 、一些 UUID 和一个字符串的类。

  3. 制作了一些方法来将 HashSet 打包到 Parcelable[] 中,反之亦然。

代码如下:

HashSet的打包方法

    private Parcelable[] hashSetToParcelableArray(HashSet<Item> items) {
        if (items != null && !items.isEmpty()) {
            Parcelable[] parcelables = new Parcelable[items.size()];
            int index = 0;
            for (Item item : items) {
                parcelables[index] = item;
                index++;
            }
            return parcelables;
        } else return new Parcelable[0];
    }

HashSet的解包方法

    private HashSet<Item> parcelableArrayToHashSet(Parcelable[] parcelables) {
        if (parcelables != null && parcelables.length != 0) {
            HashSet<Item> items = new HashSet<>();
            for (int i = 0; i < parcelables.length; i++) {
                items.add((Item) parcelables[i]);
            }
            return items;
        } else return new HashSet<Item>();
    }

所以它总是在这里失败。确切地说,在类加载器的第一行。这种方法是有道理的,因为错误是 ClassNotFoundException。但我不知道为什么会出现错误。

protected ItemList(Parcel in) {
        this.set = parcelableArrayToHashSet(in.readParcelableArray(ItemList.class.getClassLoader()));
        this.listUuid = UUID.fromString(in.readString());
        this.creatorUuid = UUID.fromString(in.readString());
        this.name = in.readString();
    }

调试器:

    E/Parcel: Class not found when unmarshalling: 
    java.lang.ClassNotFoundException: Invalid name: 
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:454)
        at android.os.Parcel.readParcelableCreator(Parcel.java:3338)
        at android.os.Parcel.readParcelable(Parcel.java:3272)
        at android.os.Parcel.readParcelableArray(Parcel.java:3398)
        at com.elevencent.myapplication.ItemList.<init>(ItemList.java:99)
        at com.elevencent.myapplication.ItemList$1.createFromParcel(ItemList.java:108)
        at com.elevencent.myapplication.ItemList$1.createFromParcel(ItemList.java:105)
        at android.os.Parcel.readParcelable(Parcel.java:3281)
        at android.os.Parcel.readValue(Parcel.java:3174)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:3567)
        at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
        at android.os.BaseBundle.unparcel(BaseBundle.java:236)
        at android.os.Bundle.getParcelable(Bundle.java:1001)
        at android.content.Intent.getParcelableExtra(Intent.java:8276)
        at com.elevencent.myapplication.ShoppingListActivity.onCreate(ShoppingListActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:7994)
        at android.app.Activity.performCreate(Activity.java:7978)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.elevencent.myapplication, PID: 12185
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.elevencent.myapplication/com.elevencent.myapplication.ShoppingListActivity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: 
        at android.os.Parcel.readParcelableCreator(Parcel.java:3364)
        at android.os.Parcel.readParcelable(Parcel.java:3272)
        at android.os.Parcel.readParcelableArray(Parcel.java:3398)
        at com.elevencent.myapplication.ItemList.<init>(ItemList.java:99)
        at com.elevencent.myapplication.ItemList$1.createFromParcel(ItemList.java:108)
        at com.elevencent.myapplication.ItemList$1.createFromParcel(ItemList.java:105)
        at android.os.Parcel.readParcelable(Parcel.java:3281)
        at android.os.Parcel.readValue(Parcel.java:3174)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:3567)
        at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
        at android.os.BaseBundle.unparcel(BaseBundle.java:236)
        at android.os.Bundle.getParcelable(Bundle.java:1001)
        at android.content.Intent.getParcelableExtra(Intent.java:8276)
        at com.elevencent.myapplication.ShoppingListActivity.onCreate(ShoppingListActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:7994)
        at android.app.Activity.performCreate(Activity.java:7978)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
I/Process: Sending signal. PID: 12185 SIG: 9
Disconnected from the target VM, address: 'localhost:63144', transport: 'socket'

编辑这是完整的 ItemList.java (如您所见,我已经尝试在此处发布后调用 Item.class.getClassLoader,但没有用)

package com.elevencent.myapplication;

import android.os.Parcel;
import android.os.Parcelable;
import java.util.HashSet;
import java.util.UUID;

/**
 * Class that holds all information about the shoppinglist and its contents.
 *
 * @author Pieter Vogt
 * @since 09.09.2021
 */
public class ItemList implements Parcelable {
    private final HashSet<Item> set;
    private final UUID listUuid;
    private final UUID creatorUuid;
    private final String name;
    
    /**
     * Constructor for ItemList.
     *
     * @param creatorUuid The uuid that represents the User that created the ItemList.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    public ItemList(String name, UUID creatorUuid) {
        this.name = name;
        this.set = new HashSet<>();
        this.listUuid = UUID.randomUUID();
        this.creatorUuid = creatorUuid;
    }
    
    /**
     * Creates a HashSet of items out of an Array of Parcelables.
     * <p>
     * This is used for unpacking the parcelable array to use it in another activity.
     *
     * @param parcelables Array of items to use in another activity.
     *
     * @return HashSet of items.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    private HashSet<Item> parcelableArrayToHashSet(Parcelable[] parcelables) {
        //Order to write or read into/out of parcel: set, listUuid, creatorUuid, name
        if (parcelables != null && parcelables.length != 0) {
            HashSet<Item> items = new HashSet<>();
            for (Parcelable parcelable : parcelables) {
                items.add((Item) parcelable);
            }
            return items;
        } else return new HashSet<>();
    }
    
    /**
     * Creates an array of parcelables out of an hashset of items.
     * <p>
     * This is used for packing the hashset for later use in another activity.
     *
     * @param items Hashset of items.
     *
     * @return Array of parcelables.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    private Parcelable[] hashSetToParcelableArray(HashSet<Item> items) {
        //Order to write or read into/out of parcel: set, listUuid, creatorUuid, name
        if (items != null && !items.isEmpty()) {
            Parcelable[] parcelables = new Parcelable[items.size()];
            int index = 0;
            for (Item item : items) {
                parcelables[index] = item;
                index++;
            }
            return parcelables;
        } else return new Parcelable[0];
    }
    
    protected ItemList(Parcel in) {
        this.set = (HashSet<Item>) parcelableArrayToHashSet(in.readParcelableArray(Item.class.getClassLoader()));
        this.listUuid = UUID.fromString(in.readString());
        this.creatorUuid = UUID.fromString(in.readString());
        this.name = in.readString();
    }
    
    public static final Creator<ItemList> CREATOR = new Creator<ItemList>() {
        @Override
        public ItemList createFromParcel(Parcel in) {
            return new ItemList(in);
        }
        
        @Override
        public ItemList[] newArray(int size) {
            return new ItemList[size];
        }
    };
    
    /**
     * Getter for HashSet.
     *
     * @return HashSet that contains all the Items.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    public HashSet<Item> getSet() {
        return set;
    }
    
    /**
     * Getter for UUID of List.
     *
     * @return UUID of the ItemList.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    public UUID getListUuid() {
        return listUuid;
    }
    
    /**
     * Getter for UUID of creator.
     *
     * @return UUID of the creator of the ItemList.
     *
     * @author Pieter Vogt
     * @since 09.09.2021
     */
    public UUID getCreatorUuid() {
        return creatorUuid;
    }
    
    public String getName() {
        return name;
    }
    
    @Override
    public int describeContents() {
        return 0;
    }
    
    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeTypedArray(hashSetToParcelableArray(set), i);
        parcel.writeString(listUuid.toString());
        parcel.writeString(creatorUuid.toString());
        parcel.writeString(name);
    }
}

【问题讨论】:

    标签: java android classnotfoundexception hashset parcelable


    【解决方案1】:

    通过查看这部分:

    this.set = parcelableArrayToHashSet(in.readParcelableArray(ItemList.class.getClassLoader()));
        
    

    您似乎想使用ItemList 类对其进行解析。但是,当您创建列表时,它使用 Item 类。

    也许您可以提供更多信息,ItemList 类是否存在于您的项目中?

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 1970-01-01
      • 2012-12-17
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多