2012-04-30 4 views
6

den folgenden Code:Warum kompiliert dieser Code nicht mit javac, hat aber keine Fehler in 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 {}; 
} 

in Eclipse kompiliert, aber nicht in der Sonne/oracle-Compiler kompilieren: nach MinTimeDoubleCoListConstraintValidator.class,

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

Dies geschah wegen dem Komma.

, wenn ich das Komma entfernt, es funktioniert:

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

ich verwende jdk 1.6.0.10.
Wissen Sie, warum dies illegal ist und in der Finsternis kompiliert wird?

+0

Die meisten interessanten Sachen. Unabhängig davon habe ich immer gedacht, dass auch Eclipse Javac verwendet. Danke für die Erleuchtung :). –

Antwort

9

Dies ist ein Fehler in Java 6 javac. The JLS allows trailing commas an einigen Stellen und der Eclipse-Compiler folgt hier dem Standard, während Java 6 niemals nachfolgende Kommas erlaubt.

Sie können versuchen, Ihren Code mit javac von Java 7 mit den Optionen -source 6 -target 6 zu kompilieren (um Java 6 kompatiblen Byte-Code zu erhalten). Wenn der Fehler immer noch vorhanden ist, file it. Es könnte behoben werden.

+0

Anscheinend ist dies in Java 7 behoben. Danke! – oshai

0

Mit einem Komma nach MinTimeDoubleCoListConstraintValidator.class denkt der Java-Compiler, dass es einen anderen Wert geben sollte. Eclipse akzeptiert das nachfolgende Komma, aber javac nicht.

+0

Ich habe das getan. Weißt du warum es passiert ist? – oshai

+0

Es ist ein Gramma Problem, Compiler wird denken, Sie hätten einen weiteren Validator nach 'MinTimeDoubleCoListConstraintValidator.class', aber Sie gaben nicht den Namen – user1335794

+0

Siehe meinen Kommentar zur Antwort von Deco: ein nachkommendes Komma wird von der JLS erlaubt –

1

Sie haben eine , am Ende der MinTimeDoubleCoListConstraintValidator.class, es sucht nach einem anderen Ausdruck in der Liste.

+0

ja , aber warum gibt es keine Fehler in der Finsternis? – oshai

+3

Ein nachkommendes Komma ist laut JLS erlaubt: http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6 und http://docs.oracle.com /javase/specs/jls/se7/html/jls-9.html#jls-9.7 –

+0

bedeutet dies, dass javac nicht der JLS folgt? – oshai

0

Es sieht so aus, als ob Sie eine Art Array von Beschränkungen deklarieren. Sie setzen nach Ihrer letzten Einschränkung ein zusätzliches Komma (,), so dass der Compiler einen anderen Wert erwartet, zusammen mit den bereits vorhandenen Werten. Versuchen Sie Folgendes:

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

Siehe meinen Kommentar zu der Antwort von Deco: ein abschließendes Komma wird von der JLS erlaubt. –

Verwandte Themen