Java – Why this is not compiling in Java

java

If you give

    public class test
    {
        public static void main(String ar[])
        {
            if (true)
                int i=0;
        }
    }

It's not compiling but the same code with braces is:

    public class test
    {
        public static void main(String ar[])
        {
            if (true)
                {int i=0;}
        }
    }

What is the explanation?

Best Solution

Variable declarations can only be declared in blocks, basically.

Looks at the grammar for "statement" in the Java Language Specification - it includes Block, but not LocalVariableDeclarationStatement - the latter is part of the grammar for a block.

This is effectively a matter of pragmatism: you can only use a single statement if you don't have a brace. There's no point in declaring a variable if you have no subsequent statements, because you can't use that variable. You might as well just have an expression statement without the variable declaration - and that is allowed.

This prevents errors such as:

if (someCondition)
    int x = 0;
    System.out.println(x);

which might look okay at first glance, but is actually equivalent to:

if (someCondition)
{
    int x = 0;
}
System.out.println(x);

Personally I always use braces anyway, as it makes that sort of bug harder to create. (I've been bitten by it once, and it was surprisingly tricky to spot the problematic code.)