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