Почему это не компилируется в Java?

Если вы дадите

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

Он не компилируется, но тот же код с фигурными скобками:

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

Какое объяснение?

Ответ 1

Переменные объявления могут быть объявлены только в блоках.

Рассматривается грамматика в "описании" в Спецификации языка Java - она ​​включает в себя Block, но не LocalVariableDeclarationStatement - последняя является частью грамматика для блока.

Это фактически вопрос прагматизма: вы можете использовать только один оператор, если у вас нет скобки. Нет смысла объявлять переменную, если у вас нет последующих операторов, потому что вы не можете использовать эту переменную. У вас может быть просто выражение выражение без объявления переменной - и это разрешено.

Это предотвращает такие ошибки, как:

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

который может выглядеть нормально на первый взгляд, но на самом деле эквивалентен:

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

Лично я всегда использую фигурные скобки, так как это затрудняет создание такой ошибки. (Меня однажды укусили, и было удивительно сложно найти проблематичный код.)

Ответ 2

Поскольку вы определяете переменную внутри if block, вам нужно иметь скобки.

Но ниже код будет компилироваться с предупреждением компилятора.

int i;
if(true)
  i = 0;

Ответ 3

Это связано с тем, что объявление переменной требует контекста блока (область его жизни), и поэтому вам нужны скобки (которые определяют блок).