【发布时间】:2015-11-17 19:55:39
【问题描述】:
我有一个 Android 应用程序,我在其中添加了一个枚举:
public enum RootNavigationOption {
HOME(R.string.home, R.drawable.ic_home), SETTINGS(R.string.settings, R.drawable.ic_settings), LOGOUT(
R.string.logout_label, R.drawable.ic_logout);
private int navigationOptionLabelResId;
private int navigationOptionImageResId;
private RootNavigationOption(int navigationOptionLabelResId, int navigationOptionImageResId) {
this.navigationOptionLabelResId = navigationOptionLabelResId;
this.navigationOptionImageResId = navigationOptionImageResId;
}
public int getNavigationOptionLabelResId() {
return navigationOptionLabelResId;
}
public int getNavigationOptionImageResId() {
return navigationOptionImageResId;
}
public static int getValuePosition(RootNavigationOption filterOption) {
int idx = 0;
for (RootNavigationOption navigationOptionIter : values()) {
if (navigationOptionIter.equals(filterOption)) {
return idx;
}
idx++;
}
return 0;
}
}
我把这个枚举放入了几个意图包中,以便与我的主要活动进行通信。我的解决方案中已经有一个这样的enum,它不会引起任何问题。但是,当我在定义这个新的enum 的情况下运行我的应用程序时,它会立即崩溃:
java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object (name = com.pack1.pack2.pack3.helpers.RootNavigationOption)
at android.os.Parcel.readSerializable(Parcel.java:2219)
at android.os.Parcel.readValue(Parcel.java:2064)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
at android.os.Bundle.unparcel(Bundle.java:249)
at android.os.Bundle.getString(Bundle.java:1118)
at android.app.ActivityOptions.<init>(ActivityOptions.java:310)
at com.android.server.am.ActivityRecord.updateOptionsLocked(ActivityRecord.java:668)
at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:1778)
at com.android.server.am.ActivityStackSupervisor.startActivityUncheckedLocked(ActivityStackSupervisor.java:1769)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1249)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:741)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3118)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3104)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:135)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2071)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
Caused by: java.lang.ClassNotFoundException: com.pack1.pack2.pack3.helpers.RootNavigationOption
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2262)
at java.io.ObjectInputStream.readEnumDescInternal(ObjectInputStream.java:1553)
at java.io.ObjectInputStream.readEnumDesc(ObjectInputStream.java:1534)
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1579)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:768)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
at android.os.Parcel.readSerializable(Parcel.java:2213)
... 16 more
Caused by: java.lang.NoClassDefFoundError: com/pack1/pack2/pack3/helpers/RootNavigationOption
... 26 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.pack1.pack2.pack3.helpers.RootNavigationOption" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
... 26 more
我无法找到问题的根本原因。我还考虑了以下帖子,但没有任何结果:
我也有:
- 检查了我在
bin文件夹中的课程,并且需要的课程在那里。 - 用apktool反编译准备好的apk,相应的smali也在里面
编辑
现在我可以确定异常实际上是由于将枚举值放入用于启动 Activity 的包中引起的,尽管堆栈跟踪中没有提到这些行:
Bundle activityOptions = new Bundle();
activityOptions.putSerializable(Constants.VIEW_MODE, RootNavigationOption.HOME);
Intent intent = new Intent(this, MainActivity.class);
我已经更改了我的应用程序的逻辑,以不在 Bundle 中使用这个枚举值,例如作为方法参数,现在它运行没有任何异常。有谁知道为什么会发生这种情况?
我现在也悬赏这个问题,因为我更困惑。
【问题讨论】:
-
on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib]]但是你说你的类存储在bin文件夹中? -
这很奇怪,根据 Enum 的文档,它说它是可序列化的。 developer.android.com/reference/java/lang/Enum.html
-
@JoxTraex 不仅如此——我成功地在 Bundle 中使用了另一个枚举(但它是片段的参数)
-
嗯,大小有区别吗?会不会跟那个有关?
-
@BNK 我使用 ADT 进行开发,是的,这些类位于项目的 bin 文件夹中。但是,我可能遗漏了您在评论的路径部分所指的内容。
标签: java android android-intent enums classnotfoundexception