Proguard Optimizer会创建奇怪的NullPointerException

时间:2015-03-18 21:07:50

标签: java nullpointerexception proguard optimization

使用Proguard的优化器后,我收到如下运行时错误:

java.lang.NullPointerException
    at java.util.EnumMap.<init>(Unknown Source)
    at Z.a(SourceFile:44415)

使用ReTrace时,我得到以下行导致问题:

temp = new EnumMap<anEnum, Object>(anEnum.class);

如果我反编译优化代码,我会找到以下代码:

line 44414: EnumMap localEnumMap;
line 44415: 
line 44416: (localEnumMap = new EnumMap(dc.class)).put(paramdc, paramObject);

我真的不明白这是怎么回事,也不知道怎么办。如果没有运行优化程序,则不会出现错误。

1 个答案:

答案 0 :(得分:0)

当Enum类与EnumMap或EnumSet结合使用时,将通过反射使用其T[] values()方法来检索枚举的所有可能值。

ProGuard不会检测到这一点,并且可能会从Enum类中删除一些方法。这基本上可以在混淆或优化步骤中发生。

为了避免此错误,您可以执行以下操作:

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

这样可以防止Enum类的values()valueOf(String)方法被混淆或删除。