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

时间:2012-04-30 08:49:59

标签: java eclipse compiler-construction javac

以下代码:

@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 你知道为什么这是非法的并且在日食中编译吗?

4 个答案:

答案 0 :(得分:9)

这是Java 6 javac中的一个错误。 The JLS allows trailing commas在某些地方,Eclipse编译器遵循此标准,而Java 6从不允许在任何地方使用尾随逗号。

您可以尝试使用{7}的javac编译代码-source 6 -target 6(以获取Java 6兼容的字节代码)。如果错误仍然存​​在,file it。它可能会得到修复。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

看起来你正在声明某种约束数组。您在最后一个约束之后放置了一个额外的逗号(,),从而使编译器期望与您已有的值一起使用其他值。试着这样做:

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