【问题标题】:why is this code not compiling with javac but has no errors in eclipse?为什么这段代码没有用 javac 编译,但在 eclipse 中没有错误?
【发布时间】:2012-04-30 08:49:58
【问题描述】:

以下代码:

@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中编译吗?

【问题讨论】:

  • 最有趣的东西。顺便说一句,我一直认为 Eclipse 也使用 javac。感谢您的启发:)。

标签: java eclipse compiler-construction javac


【解决方案1】:

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

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

【讨论】:

  • 显然这是在 java 7 中修复的。谢谢!
【解决方案2】:

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

【讨论】:

【解决方案3】:

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

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

【讨论】:

  • 查看我对 Deco 答案的评论:JLS 允许使用尾随逗号。
【解决方案4】:

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

【讨论】:

  • 我做到了。你知道为什么会这样吗?
  • 这是一个语法问题,编译器会认为你在MinTimeDoubleCoListConstraintValidator.class 之后会有一个验证器,但你没有给出名字
  • 查看我对 Deco 答案的评论:JLS 允许使用尾随逗号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2012-02-14
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 2016-02-09
  • 2021-12-27
相关资源
最近更新 更多