在尝试编译以下内容时
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;需要在一个块中编译代码?
为什么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的.
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |