编译器错误时,如果条件和没有大括号声明一个variables

为什么第一个编译好,第二个编译失败呢?

 if(proceed) {int i;} // This compiles fine. if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token) 

因为语言规范是这样说的:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html

一个声明将一个实体引入一个程序中,并且包含一个标识符(§3.8),可以在名字中用来引用这个实体。 申报的实体是以下之一:

一个局部variables,以下之一:
*在块中声明的局部variables(第14.4节)
*在for语句中声明的局部variables(第14.14节)

你的第一个例子是在一个块内声明i (用花括号表示)。 你的第二个不是,也不是一个声明。

编辑补充说:这只是让普通人感觉。 如果允许的话,这将是无用的。 它会立即超出范围。

从Java语言规范 。

      :
             { BlockStatements opt }

     BlockStatements块语句
             BlockStatements BlockStatement

     BlockStatementLocalVariableDeclarationStatement
             ClassDeclaration
             声明

     IfThenStatement:
            如果( expression声明

看来, int i是一个LocalVariableDeclarationStatement ,而不是一个Statement 。 所以这是行不通的。

这是因为它不会是有用的代码。 如果您有一个没有大括号({})的if语句,那么只会执行if之后的第一行/语句。 所以如果你只声明一个局部variables,那么就不能在其他地方使用。 所以宣布它是绝对多余的。

 if(proceed){ int i= 0; // variable i can be used here //... } if (proceed) int i; // i can not be used anywhere as it is a local variable 

如果(继续)int i;

如果我们使用if语句而不使用大括号,它将只执行第一行, if用条件方式。 其他行将正常执行。

这是编译失败,因为局部variables声明以条件方式发生,并且编译器假定它不能与虚假声明联系。

如果使用花括号,则variables声明和局部variables在块内使用,因此编译器假定它是可达的代码。 然后没有编译器错误。

就像在Java / C ++中一样,如果我们编写如果没有花括号,只有第一条语句被执行在这种情况下,variablesi是没有用的。 你在if语句中声明它,它的范围在这个语句之后结束,这是没用的

在C ++中,这是允许的,但Java不允许这样做