2012-04-30 12 views
6

निम्नलिखित कोड:यह कोड javac के साथ संकलित क्यों नहीं है लेकिन ग्रहण में कोई त्रुटि नहीं है?

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

ग्रहण में संकलित लेकिन सूरज/ओरेकल संकलक में संकलित करने के लिए विफल रहता है:

> 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 उपयोग कर रहा हूँ।
क्या आप जानते हैं कि यह अवैध क्यों है और ग्रहण में संकलित क्यों है?

+0

सबसे दिलचस्प सामान। एक असंबंधित नोट पर, मैंने हमेशा सोचा है कि ग्रहण भी जावैक का उपयोग करता है। ज्ञान के लिए धन्यवाद :)। –

उत्तर

9

यह जावा 6 के javac में एक बग है। कुछ स्थानों में The JLS allows trailing commas और ग्रहण कंपाइलर मानक का पालन करता है जबकि जावा 6 कभी भी पिछली कॉमा को कहीं भी अनुमति नहीं देता है।

आप -source 6 -target 6 विकल्पों के साथ जावा 7 से javac के साथ अपने कोड को संकलित करने का प्रयास कर सकते हैं (जावा 6 संगत बाइट कोड प्राप्त करने के लिए)। अगर बग अभी भी है, file it। यह तय हो सकता है।

+0

तत्काल यह जावा 7 में तय है। धन्यवाद! – oshai

0

MinTimeDoubleCoListConstraintValidator.class के बाद कॉमा होने के बाद, जावा कंपाइलर सोचता है कि वहां एक और मूल्य होना चाहिए। ग्रहण पीछे की कॉमा स्वीकार करता है, लेकिन जावैक नहीं करता है।

+0

मैंने ऐसा किया। क्या आप जानते हैं कि ऐसा क्यों हुआ? – oshai

+0

यह एक ग्रामा मुद्दा है, संकलक सोचेंगे कि आपके पास 'MinTimeDoubleCoListConstraintValidator.class' के बाद एक और सत्यापनकर्ता होगा, लेकिन आपने – user1335794

+0

नाम नहीं दिया था डेको के उत्तर पर मेरी टिप्पणी देखें: जेएलएस –

1

MinTimeDoubleCoListConstraintValidator.class, के अंत में आपके पास , है, यह सूची में एक और अभिव्यक्ति की तलाश में है।

+0

द्वारा पिछली कॉमा की अनुमति है , लेकिन ग्रहण में कोई त्रुटि क्यों नहीं है? – oshai

+3

जेएलएस के अनुसार एक पीछे की कॉमा की अनुमति है: http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6 और http://docs.oracle.com /javase/specs/jls/se7/html/jls-9.html#jls-9.7 –

+0

इसका मतलब है कि जावैक जेएलएस का पालन नहीं करता है? – oshai

0

ऐसा लगता है कि आप कुछ प्रकार की बाधाओं की घोषणा कर रहे हैं। आप अपनी आखिरी बाधा के बाद एक अतिरिक्त कॉमा (,) रख रहे हैं, इस प्रकार संकलक को आपके पास पहले से मौजूद कुछ अन्य मूल्यों की अपेक्षा करना है। ऐसा करने का प्रयास करें:

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

डेको के जवाब पर मेरी टिप्पणी देखें: जेएलएस द्वारा पिछली कॉमा की अनुमति है। –