Ton*_*tor 6 java grammar compiler-errors jgrasp
public class Test{
public void newMethod(){
if(true)int i=0;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了以下错误
Test.java:4: error: '.class' expected
if(true)int i=0;
^
Run Code Online (Sandbox Code Playgroud)
但如果我这样写
public class Test{
public void newMethod(){
if(true){
int i=0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
那就没有错误!
我知道这个问题对社区没有帮助,但我真的很好奇为什么我需要在这个声明中有括号.我已经用java编程了几年,我刚刚遇到这个错误.
顺便说一句,我正在使用JGrasp.
这是我的理解.引自JAVA SE 7规范的第14章:
14.2.块
块是大括号内的语句,本地类声明和局部变量声明语句的序列.
Run Code Online (Sandbox Code Playgroud)Block: { BlockStatementsopt } ........ BlockStatement: LocalVariableDeclarationStatement ClassDeclaration Statement
所以一个块总是在括号中{ ... }.
14.4.地方变量声明声明
局部变量声明语句声明一个或多个局部变量名称.
Run Code Online (Sandbox Code Playgroud)LocalVariableDeclarationStatement: LocalVariableDeclaration ; LocalVariableDeclaration: VariableModifiersopt Type VariableDeclarators ....... VariableDeclarator: VariableDeclaratorId VariableDeclaratorId = VariableInitializer.......
每个局部变量声明语句都立即由一个块包含.局部变量声明语句可以与块中的其他类型的语句自由混合.
现在,它是什么意思,"立即包含"?
有些陈述包含其他陈述作为其结构的一部分; 这样的其他陈述是陈述的替代.我们说语句S立即包含语句U,如果没有与S和U不同的语句T使得S包含T而T包含U.同样,一些语句包含表达式(§15)作为其结构的一部分.
我们来看看你的例子:
public class Test{
public void newMethod(){
if(true)int i=0;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们有以下块:
{
if(true)int i=0;
}
Run Code Online (Sandbox Code Playgroud)
在这个街区内我们有一个If Statement:
if(true)int i=0;
Run Code Online (Sandbox Code Playgroud)
反过来,该语句包含一个局部变量声明:
int i=0;
Run Code Online (Sandbox Code Playgroud)
因此,违反了该条件.回想一下:每个局部变量声明语句都会立即被一个块包含.但是,在这种情况下,局部变量声明包含在If语句中,该语句不是块本身,而是由另一个块包含.因此这段代码无法编译.
唯一的例外是for循环:
A local variable declaration can also appear in the header of a for statement (§14.14). In this case it is executed in the same manner as if it were part of a local variable declaration statement.
Run Code Online (Sandbox Code Playgroud)
(您可能需要重读几次才能理解.)
| 归档时间: |
|
| 查看次数: |
2871 次 |
| 最近记录: |