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

Java 为什么遵循控制结构条件的声明需要在块中?,java,syntax,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; // } } } 我得到以下错误 javac -Xlint:

当试图编译以下代码时

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

为什么
objectbar=(Object)foo需要在块中才能编译代码?

不能声明局部作用域变量以便在父作用域中直接使用它。

如果不放置大括号,则会导致条件的单个解释语句

因此,如果该语句是赋值,那么很明显,该赋值之后将无法使用,因为只有父作用域(花括号外)是操作它的唯一方法

因此,编译器抱怨这种情况

为了避免这种情况,并且不使用花括号,您必须执行以下操作:

public void method(String foo) {
        Object bar;
        if(foo instanceof Object)   //redundant here by the way...
          bar = (Object) foo;
          //...
}
为什么对象栏=(对象)foo;代码需要在块中才能编译

因为当一个变量是块中唯一的语句时,声明它是毫无意义的。声明没有意义,因为您将无法在任何后续代码中引用该变量。(变量的作用域就是声明。)

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

根据规范,这是您尝试使用的产品():

现在,语句生成由定义


注意这里没有LocalVariableDeclarationStatement。这只发生在JLS中定义的BlockStatement生产中。

我们再精确不过了;)
IfThenStatement:
    if ( Expression ) Statement    
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