2012-11-30 12 views
6

Quando si cerca di compilare il seguentePerché le dichiarazioni che seguono le condizioni delle strutture di controllo devono essere in un blocco?

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

ottengo i seguenti errori

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 

Perché Object bar = (Object) foo; bisogno di essere in un blocco per il codice per compilare?

risposta

7

Perché bar = (Object) foo oggetto; è necessario essere in un blocco per la compilazione del codice?

Perché è inutile dichiarare una variabile quando questa è l'unica dichiarazione nel blocco. La dichiarazione è priva di significato, in quanto non sarà possibile fare riferimento alla variabile in alcun codice successivo. (Il campo di applicazione della variabile sarebbe solo la dichiarazione.)

In sostanza, il compilatore vi impedisce di fare qualcosa di inutile.

In termini di specifiche, questo è la produzione si sta cercando di utilizzare (section 14.9 of the JLS):

IfThenStatement: 
    if (Expression) Statement  

Ora la produzione Dichiarazione è definito da section 14.5.

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 

Nota non c'è LocalVariableDeclarationStatement lì. Il solo si verifica nella produzione BlockStatement, definita in section 14.4 di JLS.

+0

Non possiamo essere più precisi;) – Mik378

1

Non è possibile dichiarare variabili di ambito locale per poterlo utilizzare direttamente negli ambiti padre.

Quando non si posizionano le parentesi graffe, questo porta a una singola istruzione interpretata per la condizione.

Quindi, se questa affermazione è un compito, chiaramente questo compito non potrebbe essere utilizzato successivamente poiché solo l'ambito genitore (al di fuori delle parentesi graffe) è il modo unico di manipolarlo.

Pertanto, il compilatore si lamenta di questa situazione.

Per evitare ciò e senza mettere le parentesi graffe, devi fare come segue:

public void method(String foo) { 
     Object bar; 
     if(foo instanceof Object) //redundant here by the way... 
      bar = (Object) foo; 
      //... 
} 
Problemi correlati