2012-11-30 4 views
6

Beim Versuch, die folgendeWarum müssen Deklarationen, die den Bedingungen von Kontrollstrukturen folgen, in einem Block sein?

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

bekomme ich folgende Fehler

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 

Warum Object bar = (Object) foo; sein müssen in einem Block zu kompilieren für den Code zu kompilieren?

Antwort

7

Warum Objekt bar = (Object) foo; muss in einem Block sein, damit der Code kompiliert werden kann?

Weil es zu erklären eine Variable sinnlos ist, wenn das die einzige Anweisung in dem Block ist. Die Deklaration ist bedeutungslos, da Sie in einem nachfolgenden Code nicht auf die Variable verweisen können. (Der Gültigkeitsbereich der Variablen wäre nur die Deklaration.)

Grundsätzlich stoppt der Compiler Sie etwas Sinnloses zu tun.

In Bezug auf die Spezifikation, das ist die Produktion Sie (section 14.9 of the JLS) zu verwenden sind versuchen:

IfThenStatement: 
    if (Expression) Statement  

Nun ist die Erklärung Produktion von section 14.5 definiert ist.

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 

Beachten Sie, dass dort kein LocalVariableDeclarationStatement vorhanden ist. Das nur tritt in der BlockStatement-Produktion auf, die in section 14.4 der JLS definiert wird.

+0

Wir können nicht präziser sein;) – Mik378

1

Sie können lokale Bereichsvariablen nicht deklarieren, um sie direkt in übergeordneten Bereichen zu verwenden.

Wenn Sie keine geschweiften Klammern platzieren, führt dies zu einer einzelnen interpretierten Anweisung für die Bedingung.

Wenn diese Anweisung also eine Zuweisung ist, kann diese Zuordnung natürlich nicht verwendet werden, da nur der übergeordnete Bereich (außerhalb geschweifter Klammern) die einzige Möglichkeit ist, ihn zu manipulieren.

Daher beschwert sich Compiler über diese Situation.

Um das zu vermeiden und ohne geschweifte Klammern zu setzen, müssen Sie wie folgt vorgehen:

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