Операторы и операции
Вопросы 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; А значит будет инициализирована локальная переменная, а значит код валидный.
Важно помнить, что к литералам и к переменным компилятор относится совершенно по-разному.