2012-04-30 31 views
6

đoạn mã sau:tại sao mã này không biên dịch với javac nhưng không có lỗi trong nhật thực?

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

biên soạn trong eclipse nhưng thất bại trong việc biên dịch trong biên dịch nắng/oracle:

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

Điều này xảy ra vì dấu phẩy sau MinTimeDoubleCoListConstraintValidator.class,.

khi tôi loại bỏ các dấu phẩy nó hoạt động tốt:

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

Tôi đang sử dụng jdk 1.6.0.10.
Bạn có biết tại sao điều này là bất hợp pháp và biên dịch trong nhật thực?

+0

Thú vị nhất. Trên một lưu ý không liên quan, tôi đã luôn luôn nghĩ rằng Eclipse cũng sử dụng javac. Cảm ơn sự khai ngộ :). –

Trả lời

9

Đây là lỗi trong Java 6's javac. The JLS allows trailing commas ở một số nơi và trình biên dịch Eclipse tuân theo tiêu chuẩn ở đây trong khi Java 6 không bao giờ cho phép dấu phẩy ở bất kỳ đâu.

Bạn có thể thử biên dịch mã của mình bằng javac từ Java 7 với các tùy chọn -source 6 -target 6 (để nhận mã byte tương thích Java 6). Nếu lỗi vẫn còn đó, file it. Nó có thể được cố định.

+0

Tốt hơn điều này được sửa trong java 7. Cảm ơn! – oshai

0

Bằng cách có dấu phẩy sau MinTimeDoubleCoListConstraintValidator.class, trình biên dịch java cho rằng phải có một giá trị khác. Eclipse chấp nhận dấu phẩy, nhưng javac thì không.

+0

Tôi đã làm điều đó. bạn có biết tại sao nó xảy ra không? – oshai

+0

nó là một vấn đề ngữ pháp, trình biên dịch sẽ nghĩ rằng bạn sẽ có thêm một trình xác nhận sau 'MinTimeDoubleCoListConstraintValidator.class', nhưng bạn không đưa ra tên – user1335794

+0

Xem nhận xét của tôi cho câu trả lời của Deco: dấu phẩy sau được cho phép bởi JLS –

1

Bạn có một số , ở cuối MinTimeDoubleCoListConstraintValidator.class, nó đang tìm một biểu thức khác trong danh sách.

+0

yes , nhưng tại sao không có lỗi trong nhật thực? – oshai

+3

Dấu phẩy sau được cho phép theo JLS: http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6 và http://docs.oracle.com /javase/specs/jls/se7/html/jls-9.html#jls-9.7 –

+0

điều này có nghĩa là javac không tuân theo JLS? – oshai

0

Dường như bạn đang khai báo một số loại ràng buộc. Bạn đang đặt thêm dấu phẩy (,) sau lần ràng buộc cuối cùng của bạn, do đó làm cho trình biên dịch mong đợi một số giá trị khác cùng với các giá trị bạn đã có. Hãy thử thực hiện việc này:

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

Xem nhận xét của tôi về câu trả lời của Deco: dấu phẩy sau được phép bởi JLS. –

Các vấn đề liên quan