为什么这段代码用javac编译不出来,但在eclipse中却没有错误?

问题描述 投票:0回答:4

以下代码:

@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Constraint(validatedBy = {
        MinTimeIntCoConstraintValidator.class, 
        MinTimeIntCoListConstraintValidator.class,
        MinTimeDoubleCoConstraintValidator.class, 
        MinTimeDoubleCoListConstraintValidator.class,
        })
@Documented
public @interface MinTimeValueCo
{
    int value();
    String message() default "value does not match minimum requirements";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default {};
}

在eclipse中编译,但在sun/oracle编译器中编译失败:

> MinTimeValueCo.java:19: illegal start of expression
>     [javac]       })
>     [javac]       ^
>     [javac] 1 error

发生这种情况是因为

MinTimeDoubleCoListConstraintValidator.class,
后面的逗号。

当我删除逗号时,它工作正常:

@Constraint(validatedBy = {
        MinTimeIntCoConstraintValidator.class, 
        MinTimeIntCoListConstraintValidator.class,
        MinTimeDoubleCoConstraintValidator.class, 
        MinTimeDoubleCoListConstraintValidator.class
        })

我使用的是jdk 1.6.0.10。
你知道为什么这是非法的并且在 eclipse 中编译吗?

java eclipse javac
4个回答
10
投票

这是 Java 6 中的一个错误

javac
JLS 在某些地方允许尾随逗号,并且 Eclipse 编译器遵循此处的标准,而 Java 6 在任何地方都不允许尾随逗号。

您可以尝试使用 Java 7 中的

javac
和选项
-source 6 -target 6
来编译代码(以获取 Java 6 兼容的字节代码)。如果错误仍然存在,请将其归档。它可能会得到修复。


1
投票

您在

,
的末尾有一个
MinTimeDoubleCoListConstraintValidator.class,
,它正在列表中寻找另一个表达式。


0
投票

看起来您正在声明某种约束数组。您在最后一个约束之后放置了一个额外的逗号 (

,
),从而使编译器期望一些其他值以及您已有的值。尝试这样做:

@Constraint(validatedBy = {
        MinTimeIntCoConstraintValidator.class, 
        MinTimeIntCoListConstraintValidator.class,
        MinTimeDoubleCoConstraintValidator.class, 
        MinTimeDoubleCoListConstraintValidator.class
        })

0
投票

通过在

MinTimeDoubleCoListConstraintValidator.class
之后添加逗号,java 编译器认为应该有另一个值。 Eclipse 接受尾随逗号,但 javac 不接受。

© www.soinside.com 2019 - 2024. All rights reserved.