2012-04-30 22 views
6

następujący kod:dlaczego ten kod nie kompiluje się z javac, ale nie ma błędów w 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 {}; 
} 

skompilowany w Eclipse, ale nie trafia do kompilacji w słońce/oracle kompilatora:

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

Stało się to ze względu na przecinek po MinTimeDoubleCoListConstraintValidator.class,.

gdy usunąłem przecinek to działa dobrze:

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

Używam JDK 1.6.0.10.
Czy wiesz, dlaczego jest to niezgodne z prawem i kompilacja w czasie zaćmienia?

+0

Najbardziej interesujące rzeczy. Na niepowiązanej notatce zawsze myślałem, że Eclipse również używa javac. Dzięki za oświecenie :). –

Odpowiedz

9

Jest to błąd w Java 6 na javac. The JLS allows trailing commas w niektórych miejscach i kompilator Eclipse podąża za standardem, podczas gdy Java 6 nigdy nie dopuszcza przecinków ciągłych w dowolnym miejscu.

Możesz spróbować skompilować swój kod za pomocą javac z Java 7 za pomocą opcji -source 6 -target 6 (aby uzyskać kod bajtowy zgodny z Java 6). Jeśli błąd nadal występuje, file it. To może zostać naprawione.

+0

Apperantly to jest naprawione w java 7. Dzięki! – oshai

0

Po przecinku po MinTimeDoubleCoListConstraintValidator.class kompilator języka Java uważa, że ​​powinna istnieć inna wartość. Eclipse akceptuje końcowy przecinek, ale javac tego nie robi.

+0

Zrobiłem to. czy wiesz, dlaczego to się stało? – oshai

+0

jest to problem grammy, kompilator pomyśli, że masz jeszcze jeden walidator po 'MinTimeDoubleCoListConstraintValidator.class', ale nie podałeś nazwy – user1335794

+0

Zobacz mój komentarz do odpowiedzi Deco: końcowy przecinek jest dozwolony przez JLS –

1

Masz , na końcu MinTimeDoubleCoListConstraintValidator.class, szuka innego wyrażenia na liście.

+0

tak , ale dlaczego nie ma błędów w zaćmieniu? – oshai

+3

Przecinek końcowy jest dozwolony zgodnie z JLS: http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6 i http://docs.oracle.com /javase/specs/jls/se7/html/jls-9.html#jls-9.7 –

+0

oznacza to, że javac nie działa zgodnie z JLS? – oshai

0

Wygląda na to, że deklarujesz jakąś tablicę ograniczeń. Umieszczasz dodatkowy przecinek (,) po ostatnim ograniczeniu, co powoduje, że kompilator oczekuje innej wartości razem z tymi, które już masz. Spróbuj zrobić tak:

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

Zobacz mój komentarz do odpowiedzi Deco: końcowy przecinek jest dozwolony przez JLS. –

Powiązane problemy