ACRA 报告的我的 Android 应用程序出现了一个奇怪的错误。似乎在枚举中调用了 clone()。这是堆栈跟踪:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
... 2 more
Caused by: java.lang.CloneNotSupportedException: Class doesn't implement Cloneable
at java.lang.Object.clone(Object.java:155)
at org.digitalcure.ccnf.app.io.data.Glyx.org.digitalcure.ccnf.app.io.data.Glyx[] values()(SourceFile:17)
at org.digitalcure.ccnf.app.io.data.Glyx.org.digitalcure.ccnf.app.io.data.Glyx getForDatabaseValue(int)(SourceFile:140)
...
这是枚举的代码:
package org.digitalcure.ccnf.app.io.data;
import org.digitalcure.ccnf.app.R;
import android.content.Context;
import android.content.res.Resources;
public enum Glyx {
HIGH(-1),
MEDIUM(0),
LOW(1);
private final int value;
private Glyx(final int value) {
this.value = value;
}
public static Glyx getForNormedValue(final int value) {
final Glyx[] array = Glyx.values();
for (final Glyx candidate : array) {
if (candidate.value == value) {
return candidate;
}
}
return null;
}
public static Glyx getForDatabaseValue(final int value) {
return getForNormedValue(value + HIGH.value);
}
// more code follows...
}
我删除了文档和其他无趣的代码,所以第 17 行引用了“public enum Glyx {”,第 140 行引用了“return getForNormedValue(value + HIGH.value);”。
我已经检查了我的 ProGuard 配置。它包含以下枚举规则:
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
我对枚举中的“clone()”调用感到困惑,我无法解释这里发生了什么。我能做些什么来避免这个异常?这个问题有什么解释吗?任何帮助表示赞赏。
环境:Android 4.0.4,中兴Grand X In