2012-11-30 10 views
6

जब संकलित करने के लिए कोशिश कर रहा है निम्नलिखितनियंत्रण संरचनाओं की शर्तों के बाद घोषणाओं को ब्लॉक में क्यों होना चाहिए?

public class Test { 
    public void method(String foo) { 
     // This compiles if the curly braces are uncommented 
     if(foo instanceof Object) // { 
      Object bar = (Object) foo; 
     // } 
    } 
} 

मैं निम्न त्रुटियों

javac -Xlint:all Test.java 
Test.java:5: error: not a statement 
      Object bar = foo; 
      ^
Test.java:5: error: ';' expected 
      Object bar = foo; 
       ^
2 errors 

क्यों Object bar = (Object) foo; कोड को संकलित करने के लिए एक ब्लॉक में रहने की जरूरत है?

उत्तर

7

क्यों वस्तु बार = (वस्तु) foo करता है, कोड संकलित करने के लिए ब्लॉक के लिए एक ब्लॉक में होना चाहिए?

क्योंकि यह को व्यर्थ है एक चर जब कि ब्लॉक में केवल बयान है की घोषणा। घोषणा अर्थहीन है, क्योंकि आप किसी भी बाद के कोड में चर को संदर्भित नहीं कर पाएंगे। (चर का दायरा होगा घोषणा।)

असल में, कंपाइलर आपको कुछ व्यर्थ करने से रोक रहा है।

IfThenStatement: 
    if (Expression) Statement  

अब वक्तव्य उत्पादन section 14.5 द्वारा परिभाषित किया गया है:

विनिर्देश के संदर्भ में, इस उत्पादन आप (section 14.9 of the JLS) का उपयोग करने की कोशिश कर रहे है।

Statement: 
    StatementWithoutTrailingSubstatement 
    LabeledStatement 
    IfThenStatement 
    IfThenElseStatement 
    WhileStatement 
    ForStatement 

StatementWithoutTrailingSubstatement: 
    Block 
    EmptyStatement 
    ExpressionStatement 
    AssertStatement 
    SwitchStatement 
    DoStatement 
    BreakStatement 
    ContinueStatement 
    ReturnStatement 
    SynchronizedStatement 
    ThrowStatement 
    TryStatement 

StatementNoShortIf: 
    StatementWithoutTrailingSubstatement 
    LabeledStatementNoShortIf 
    IfThenElseStatementNoShortIf 
    WhileStatementNoShortIf 
    ForStatementNoShortIf 

ध्यान दें कि वहां कोई स्थानीय उपलब्धिक्लेक्शनेशन नहीं है। वह केवल ब्लॉकस्टेटमेंट उत्पादन में होता है, जिसे जेएलएस के section 14.4 में परिभाषित किया गया है।

+0

हम और अधिक सटीक नहीं हो सकते हैं;) – Mik378

1

आप मूल दायरे में सीधे इसका उपयोग करने के लिए स्थानीय स्कोप चर घोषित नहीं कर सकते हैं।

जब आप घुंघराले ब्रेसिज़ नहीं डालते हैं, तो यह स्थिति के लिए एक व्याख्यात्मक बयान की ओर जाता है।

इस प्रकार, यदि यह कथन एक असाइनमेंट है, तो स्पष्ट रूप से यह असाइनमेंट बाद में उपयोग नहीं किया जा सका क्योंकि केवल माता-पिता का दायरा (घुंघराले ब्रेसिज़ के बाहर) इसका उपयोग करने का अनोखा तरीका है।

इसलिए, संकलक इस स्थिति के बारे में शिकायत करता है।

आदेश है कि से बचने के लिए और घुंघराले ब्रेसिज़ डाले बिना, आप इस प्रकार करना है:

public void method(String foo) { 
     Object bar; 
     if(foo instanceof Object) //redundant here by the way... 
      bar = (Object) foo; 
      //... 
} 
संबंधित मुद्दे