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行目は「publicenum Glyx {」を参照し、140行目は「returngetForNormedValue(value + HIGH.value);」を参照しています。
ProGuardの構成をすでに確認しました。列挙型には次のルールが含まれています。
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
列挙型での「clone()」の呼び出しについて混乱しており、ここで何が起こるかを説明できません。この例外を回避するにはどうすればよいですか?この問題の説明はありますか?どんな助けでも大歓迎です。
環境:Android 4.0.4、ZTE Grand X In