为什么遵循控制结构条件的声明需要在块中?

N.N*_*.N. 6 java syntax

在尝试编译以下内容时

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

我收到以下错误

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
Run Code Online (Sandbox Code Playgroud)

为什么Object bar = (Object) foo;需要在一个块中编译代码?

Jon*_*eet 7

为什么Object bar =(Object)foo; 需要在一个块中为代码编译?

因为当这是块中唯一的语句时声明变量是没有意义的.声明没有意义,因为您将无法在任何后续代码中引用该变量.(变量的范围只是声明.)

基本上,编译器阻止你做一些毫无意义的事情.

就规范而言,这是您尝试使用的产品(JLS的第14.9节):

IfThenStatement:
    if ( Expression ) Statement    
Run Code Online (Sandbox Code Playgroud)

现在语句生成由第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
Run Code Online (Sandbox Code Playgroud)

注意那里没有LocalVariableDeclarationStatement.这发生在块语句的生产,在定义部分14.4的JLS的.