Object creating statement in Java doesn't allow to use a single-line loop. Why?

前端 未结 4 1354
遇见更好的自我
遇见更好的自我 2020-12-11 01:03

The following program has no importance of its own. It just counts the number of objects created through the use of a for loop using a static field inside the class Counter

相关标签:
4条回答
  • 2020-12-11 01:13

    Because you're creating a scope variable. Java is telling you that this does nothing because all it does is allocate memory and as soon as the loop goes through again you lose that one and make a new one. Essentially the entire loop is a NOP which is why it's telling you that it reduces to a do nothing statement.

    By the loop being a NOP I mean that the declaration in the loop is a NOP.

    The reason the version with the braces work is because the compiler doesn't inspect the usage within the scope because there are braces. It's probably something to do with the parse tree generated from one line statements vs. the parse tree created when there's a full loop scope.

    0 讨论(0)
  • 2020-12-11 01:16

    To understand why this happens, you have to look at Java's Blocks and Statements syntax in the language specification.

    A ForStatement is defined as:

    ForStatement:
        for ( ForInitopt ; Expressionopt ; ForUpdateopt )
            Statement
    

    Statement is defined as:

    Statement:
        StatementWithoutTrailingSubstatement
        LabeledStatement
        IfThenStatement
        IfThenElseStatement
        WhileStatement
        ForStatement
    
    StatementWithoutTrailingSubstatement:
        Block
        EmptyStatement
        ExpressionStatement
        SwitchStatement
        DoStatement
        BreakStatement
        ContinueStatement
        ReturnStatement
        SynchronizedStatement
        ThrowStatement
        TryStatement
    

    Then, looking at Block:

    Block:
        { BlockStatementsopt }
    
    BlockStatements:
        BlockStatement
        BlockStatements BlockStatement
    
    BlockStatement:
        LocalVariableDeclarationStatement
        ClassDeclaration
        Statement
    

    You'll notice that, within this specification, LocalVariableDeclarationStatement is not valid unless it is in a block. But, because the ForStatement requires that it is followed by a statement, there MUST exist parenthesis in order to make the expression valid. As such, any local variable declaration would be invalid in the loop without the brackets.

    0 讨论(0)
  • 2020-12-11 01:17

    You can also get it to work without braces this way:

    Counter counter;
        for (int i = 0; i < 50; i++)
        counter = new Counter();
    

    Not that there's any reason you'd ever want to do such a thing. Leaving off the brackets is a really bad idea because adding a statement actually makes the control flow change.

    0 讨论(0)
  • 2020-12-11 01:26

    @JasCav is right, however you can get it to compile:

    for (int i=0;i<50;i++)
        new Counter();
    
    0 讨论(0)
提交回复
热议问题