2017-03-28 13 views
18

मैं जावा सिंटेक्स के साथ खेल रहा हूं, इसलिए सवाल पूरी तरह से जिज्ञासा से उत्पन्न होता है। कोड का यह टुकड़ा: क्योंकि एक लेबल (http) "एक बयान द्वारा पालन किया जाना चाहिए"जावा: लेबल के बाद अनुमत बयान

http://www.google.com 
Object val = 5 <- 4; 

, नहीं संकलन करता है। निम्नलिखित दो वेरिएंट संकलन है:

http://www.google.com 
{ Object val = 5 <- 4; } 

और

Object val; 
http://www.google.com 
val = 5 <- 4; 

दोनों ही मामलों में, मैं एक अभिव्यक्ति के लिए एक घोषणा से बदल। यह मैं आश्चर्य वास्तव में एक "बयान" जावा में है क्या करता है, लेकिन doc कहता है: घोषणा बयान और नियंत्रण प्रवाह बयान:

अभिव्यक्ति बयान के अलावा, वहाँ बयान के दो अन्य प्रकार के होते हैं। एक घोषणा बयान एक चर घोषित करता है।

JLS बस का कहना है (लेबल पर) है कि

पहचानकर्ता तुरंत निहित वक्तव्य के लेबल घोषित किया गया है।

यह "अभिव्यक्ति बयान" के बारे में कुछ भी नहीं कहता है।

क्या मुझे कुछ याद आया, या यह सिर्फ एक अस्पष्ट/गलत विनिर्देश है?

+0

वह अभिव्यक्ति क्या है "http://www.google.com" '? –

+8

@MykhayloKopytonenko यह एक अभिव्यक्ति नहीं है, यह एक टिप्पणी में बस कुछ पाठ है। लेबल 'http:' है, और फिर '//' एक पंक्ति टिप्पणी शुरू करता है। मुश्किल मुश्किल! :) – yshavit

+2

कोड पागल है! –

उत्तर

20

आप JLS के अध्याय 14 में थोड़ा और अधिक ध्यान से पढ़ें, तो आप पाएंगे कि एक LocalVariableDeclarationStatement नहीं एक वक्तव्य है। उनमें से बहुत सहज नहीं है, है ना?

विशेष रूप से, JLS 14.2 में, हम देखते हैं कि:

  • एक ब्लॉक अनिवार्य रूप से शून्य या अधिक BlockStatements के होते हैं
  • एक BlockStatement में से एक है:
    • LocalVariableDeclarationStatement
    • ClassDeclaration
    • विवरण

तो एक स्थानीय वैरिएबल डिस्क्लेरेशन स्टेटमेंट पदानुक्रम में वक्तव्य का वंशज नहीं है, बल्कि एक भाई है। वे दोनों प्रकार के ब्लॉकस्टेटमेंट हैं।

एक लेबल को एक सच्चे वक्तव्य — द्वारा पालन किया जाना चाहिए, जो कि ब्लॉकस्टेटमेंट का विशिष्ट उप प्रकार है, न तो स्थानीय वैरिएबल डिस्क्लेरेशन स्टेटमेंट और न ही क्लासडिक्लेरेशन। विवरण के विभिन्न उपप्रकार 14.5 में सूचीबद्ध हैं। आपको उनके बीच LocalVariableDeclarationStatement नहीं मिलेगा, हालांकि आपको स्टेटमेंट विथआउट ट्रेलिंग सबस्टेटमेंट के उप-प्रकार के रूप में अभिव्यक्ति स्टेटमेंट मिलेगा।

+1

यह वास्तव में नामकरण का एक बेहद अनूठा विकल्प है। उद्धृत अनुभाग जावा 8 [जेएलएस 14.2] में केवल मामूली रूप से भिन्न है (https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.2) (एकाधिक के लिए नोटेशन कथन थोड़ा सा ऐरे-जैसे "[]" में बदल गया है, और लिंक जोड़े गए हैं)। – Hulk

+0

ठीक है, जेएलएस 14.2 लागू होता है क्योंकि फ़ंक्शन बॉडी एक ब्लॉक स्टेटमेंट है ... धन्यवाद! – Moritz

संबंधित मुद्दे