枚举的CloneNotSupportedException

时间:2013-02-10 11:03:24

标签: java android enums clone

我的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配置。它包含以下enum规则:

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

我对枚举中“clone()”的调用感到困惑,我无法解释这里发生了什么。我该怎么做才能避免这种异常?这个问题有什么解释吗?任何帮助表示赞赏。

环境:Android 4.0.4,中兴通讯Grand X In

0 个答案:

没有答案