Почему это не компилирует в 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;}
        }
    }

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

10
задан Peter Mortensen 29 December 2009 в 20:53
поделиться

3 ответа

Объявления переменных могут декларироваться только в блоках, в основном.

Смотрите на грамматику для "оператора" в Спецификации языка Java - она включает в себя Блок, но не Локальные ПеременныеДекларацию - последняя является частью грамматики для блока .

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

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

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

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

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

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

.
27
ответ дан 3 December 2019 в 14:34
поделиться

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

.
2
ответ дан 3 December 2019 в 14:34
поделиться

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

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

int i;
if(true)
  i = 0;
4
ответ дан 3 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: