Операторы и операции

Вопросы 11 — 20

Вопрос 11

Что будет, откомпилировать и запустить следующий код:

boolean check = true;

int a;


if (check) {

a = 1;

}

System.out.println(a);

а. Код не откомпилируется.
б. Код откомпилируется, но во время выполнения вылетит исключение.
в. Программа отработает нормально и выведет в консоль 1.

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

Компилятор следит за тем, чтобы все локальные переменные методов были инициализированы перед первым использованием.

Чтобы убедится, что инструкция a = 1; выполнится компилятор должен быть уверен, что мы "войдём" в if. Для этого нужно разыменовать переменную check.

Компилятор не разыменовывает переменные. В данной ситуации он просто откажется компилировать программу и выдаст ошибку: variable a might not hane been initialized.

Вопрос 12

Что будет, откомпилировать и запустить следующий код:

int a;


if (true) {

a = 1;

}

System.out.println(a);

а. Код не откомпилируется.
б. Код откомпилируется, но во время выполнения вылетит исключение.
в. Программа отработает нормально и выведет в консоль 1.

в. Программа отработает нормально и выведет в консоль 1.

Перед компиляцией программы компилятор проводит разнообразную предварительную обработку литералов. Помимо всего прочего, компилятор совершенно однозначно интерпретирует для себя, что if (true) приведёт к тому, что код следующий за данным условием непременно выполнится, а значит выполнится инструкция a = 1; А значит будет инициализирована локальная переменная, а значит код валидный.

Важно помнить, что к литералам и к переменным компилятор относится совершенно по-разному.