【问题标题】:How to suppress "unknown enum constant" warnings?如何抑制“未知枚举常量”警告?
【发布时间】:2013-09-15 05:45:14
【问题描述】:

The Checkers Framework 引用 java.lang.annotation.ElementType.TYPE_USE,它是在 JDK8 中添加的。当我在JDK7下使用它时,我收到以下警告:

unknown enum constant java.lang.annotation.ElementType.TYPE_USE

这是一个合理的警告,但我如何在我认为无害的情况下隐藏它?

【问题讨论】:

    标签: java annotations javac checker-framework


    【解决方案1】:

    事实证明,不存在无害的未知枚举常量。一旦我通过了编译器警告,我就会在运行时遇到异常:

    java.lang.ArrayStoreException: sun.reflect.annotation.EnumConstantNotPresentExceptionProxy
        at sun.reflect.annotation.AnnotationParser.parseEnumArray(AnnotationParser.java:693) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:482) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:306) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:241) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:88) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70) ~[na:1.7.0_40]
        at java.lang.Class.initAnnotationsIfNecessary(Class.java:3168) ~[na:1.7.0_40]
        at java.lang.Class.getAnnotation(Class.java:3127) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationType.<init>(AnnotationType.java:131) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:84) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:221) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:88) ~[na:1.7.0_40]
        at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70) ~[na:1.7.0_40]
        at java.lang.reflect.Method.declaredAnnotations(Method.java:714) ~[na:1.7.0_40]
        at java.lang.reflect.Method.getAnnotation(Method.java:700) ~[na:1.7.0_40]
        at com.google.inject.spi.InjectionPoint.getAtInject(InjectionPoint.java:466) ~[guice-3.0-no_aop.jar:na]
        at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:664) ~[guice-3.0-no_aop.jar:na]
        at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:356) ~[guice-3.0-no_aop.jar:na]
        at com.google.inject.internal.MembersInjectorStore.createWithListeners(MembersInjectorStore.java:90) ~[guice-3.0-no_aop.jar:na]
        at com.google.inject.internal.MembersInjectorStore.access$000(MembersInjectorStore.java:34) ~[guice-3.0-no_aop.jar:na]
        at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:42) ~[guice-3.0-no_aop.jar:na]
        at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:39) ~[guice-3.0-no_aop.jar:na]
        at com.google.inject.internal.FailableCache$1.apply(FailableCache.java:39) ~[guice-3.0-no_aop.jar:na]
        at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549) ~[guice-3.0-no_aop.jar:na]
        ... 102 common frames omitted
    

    意思是,任何使用java.lang.reflect.Method.getAnnotation() 的代码都会在运行时失败。

    就我而言,这个问题是由https://code.google.com/p/checker-framework/issues/detail?id=255引起的

    【讨论】:

      【解决方案2】:

      如果你得到这个编译时错误:

        unknown enum constant java.lang.annotation.ElementType.TYPE_USE
      

      那么您正在使用 Java 7 JDK 进行编译,但您的代码引用了仅在 Java 8 JDK 中定义的枚举常量。问题可能是您的代码使用了引用枚举常量的库。特别是 Checker Framework 附带的类型注释参考 ElementType.TYPE_USE。您可以使用 Checker 框架,但仍按照 Checker 框架手册的“Class-file compatibility with Java 7”部分中的说明在 Java 7 JVM 中编译和运行您的代码。

      【讨论】:

        猜你喜欢
        • 2018-03-23
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 2020-01-02
        • 1970-01-01
        • 2015-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多