一个单行循环,在Java中有一对强制括号

时间:2012-07-22 17:42:11

标签: java loops

以下代码段中的代码运行正常。它计算使用类型int的静态字段cnt创建的对象数。

public class Main
{
    private static int cnt;

    public Main()
    {
        ++cnt;
    }

    public static void main(String[] args)
    {
        for (int a=0;a<10;a++)
        {
            Main main=new Main();
        }

        /*for (int a=0;a<10;a++)
            Main main=new Main();*/

        System.out.println("Number of objects created : "+cnt+"\n\n");
    }
}

显示以下输出。

Number of objects created : 10

唯一的问题是,当我从上面的for循环中删除一对大括号时(请参阅注释的for循环),会发出编译时错误,指示

  

不是声明。

为什么在这种特殊情况下,即使循环只包含单个语句,一对大括号强制

3 个答案:

答案 0 :(得分:28)

声明变量(在这种情况下为main)时:

Main main = new Main();

即使它有副作用,也不算作声明。因为它是一个恰当的陈述,你应该做

new Main();

为什么

... {
    Main main = new Main();
}

允许? { ... }是一段代码, 计为一个语句。在这种情况下,main变量可以在声明之后但在结束括号之前使用。有些编译器忽略了它确实没有被使用的事实,其他编译器也会发出警告。

答案 1 :(得分:3)

使用新语句创建单行块是有意义的。没有意义的是在单行块中保存对刚创建的对象的引用,因为您无法从for scope范围外访问变量main。

也许(只是我的猜测)编译器会强制您明确键入括号,因为在这种情况下保持引用没有意义,希望您能够意识到无用的引用。

答案 2 :(得分:3)

for定义如下。

BasicForStatement:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement

ForStatementNoShortIf:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList

StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression

Blocks定义如下。

  

块是一系列语句,本地类声明和   大括号内的局部变量声明语句。

Block:
{ BlockStatementsopt }

BlockStatements:
    BlockStatement
    BlockStatements BlockStatement

BlockStatement:
    LocalVariableDeclarationStatement
    ClassDeclaration
    Statement

Statements定义如下。

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

根据规范,LocalVariableDeclarationStatement(查看块部分)无效,如果它未在块中声明。因此,除非您使用一对大括号,否则以下for循环会报告您在问题中提到的编译时错误“ not a statement ”。

for (int a=0;a<10;a++)
        Main main=new Main();