Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Proguard优化器创建奇怪的NullPointerException_Java_Nullpointerexception_Proguard_Optimization - Fatal编程技术网

Java Proguard优化器创建奇怪的NullPointerException

Java Proguard优化器创建奇怪的NullPointerException,java,nullpointerexception,proguard,optimization,Java,Nullpointerexception,Proguard,Optimization,在使用Proguard的优化器时,我得到如下运行时错误: java.lang.NullPointerException at java.util.EnumMap.<init>(Unknown Source) at Z.a(SourceFile:44415) -keepclassmembers enum xxx.yyy.MyEnum { public static **[] values(); public static ** valueOf(java

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

java.lang.NullPointerException
    at java.util.EnumMap.<init>(Unknown Source)
    at Z.a(SourceFile:44415)
-keepclassmembers enum xxx.yyy.MyEnum {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

我真的不明白这是怎么发生的,也不知道该怎么办。如果不运行优化器,则不会出现错误。

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

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

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

java.lang.NullPointerException
    at java.util.EnumMap.<init>(Unknown Source)
    at Z.a(SourceFile:44415)
-keepclassmembers enum xxx.yyy.MyEnum {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

这将防止枚举类的
values()
valueOf(String)
方法被混淆或删除。

枚举和混淆器/优化器可能很棘手(对于另一个混淆器,我必须编辑配置文件,以确保某些与枚举相关的方法在混淆期间保持不变)。抱歉,这不是答案,而是相关的:奇怪的是,它只发生在优化时。只要启用模糊处理,就没有问题。只有在删除-dontoptimize标志时,才会创建错误。我还为enum
-keepclassmembers添加了proguard代码块,allowoptimization enum*{public static**[]values();public static**valueOf(java.lang.String);}
好吧,到目前为止还没有答案,所以一些手工操作:显然,唯一能在给定(反编译)中导致NullPointerException的事情代码是在
dc.class
发生的解引用。是否可以(从剩余的代码)派生出这个
dc
是什么,它来自哪里,以及为什么它可能是
null
?是的,dc是一个枚举,就像上面在(anEnum.class)中一样。从反编译代码:
public enum dc{static{{a,b,c,d}[4]=u;}