2012-04-30 20 views
6

el siguiente código:¿por qué este código no se está compilando con javac pero no tiene errores en eclipse?

@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 {}; 
} 

compilan en Eclipse, pero falla al compilar en el compilador de Sun/Oracle:

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

Esto sucedió debido a la coma después de MinTimeDoubleCoListConstraintValidator.class,.

cuando quité la coma que funciona bien:

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

estoy usando JDK 1.6.0.10.
¿Sabes por qué esto es ilegal y compilando en eclipse?

+0

Lo más interesante. En una nota no relacionada, siempre he pensado que Eclipse también usa javac. Gracias por la iluminación :). –

Respuesta

9

Esto es un error en Java 6's javac. The JLS allows trailing commas en algunos lugares y el compilador de Eclipse sigue el estándar aquí, mientras que Java 6 nunca permite las comas finales en ninguna parte.

Puede intentar compilar su código con javac de Java 7 con las opciones -source 6 -target 6 (para obtener el código de bytes compatible con Java 6). Si el error persiste, file it. Puede ser arreglado.

+0

Aparentemente esto está arreglado en Java 7. ¡Gracias! – oshai

0

Al tener una coma después de MinTimeDoubleCoListConstraintValidator.class, el compilador de Java piensa que debería haber otro valor. Eclipse acepta la coma final, pero javac no.

+0

Lo hice. ¿sabes por qué sucedió? – oshai

+0

es un problema de gramma, el compilador pensará que tendría un validador más después de 'MinTimeDoubleCoListConstraintValidator.class', pero no dio el nombre – user1335794

+0

Vea mi comentario en la respuesta de Deco: una coma final está permitida por el JLS –

1

Tiene , al final de MinTimeDoubleCoListConstraintValidator.class, está buscando otra expresión en la lista.

+0

sí , pero ¿por qué no hay errores en eclipse? – oshai

+3

Se permite una coma final según el JLS: http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6 y http://docs.oracle.com /javase/specs/jls/se7/html/jls-9.html#jls-9.7 –

+0

esto significa que javac no sigue el JLS? – oshai

0

Parece que está declarando algún tipo de conjunto de restricciones. Está colocando una coma adicional (,) después de su última restricción, lo que hace que el compilador espere algún otro valor junto con los que ya tiene. Intente hacer esto:

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

Ver mi comentario a la respuesta de Deco: el JLS permite una coma final. –

Cuestiones relacionadas