если пример оператора выдает ошибку в условии и в одном сценарии ошибка не появляется - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь выполнить приведенный ниже код оператора if, получаю сообщение об ошибке, в котором говорится, что «переменная j, возможно, не была инициализирована».

Пример 1:

public class PrimitiveTypesChallenge {

   public static void main(String[] args) {

        int i = 10;
        int j;
        if(i == 10) {
            j = 20;
        }

        System.out.println(j);
    }
}

Я инициализировал значение для переменной j внутри блока if.

Пример 2:

public class PrimitiveTypesChallenge {

   public static void main(String[] args) {

        int i = 10;
        int j;
        if(i == 10) {
            j = 20; 
        }
        else {
           j = 30;
        }

        System.out.println(j);
    }
}

В обоих примерах условия выполняются, однако в примере 1 получена ошибка, а в примере 2 нет ошибки , Я так путаюсь с этими двумя сценариями ios. Может ли кто-нибудь помочь мне понять всю концепцию, стоящую за этим?

1 Ответ

3 голосов
/ 04 мая 2020

В примере 1 условие всегда истинно

Мы знаем это, но компилятор недостаточно умен, чтобы обнаружить этот факт. Мы знаем это, потому что мы прочитали код и оценили выражение i == 10 в наших головах. Компилятор этого не делает. Компиляторы могут оценивать константные выражения , а i == 10 не является константным выражением, поскольку оно включает переменную i.

компилятор не знает, что i == 10 всегда верно в примере 1, поэтому он думает, что i == 10 может быть ложным. В таком случае j не будет инициализирован, следовательно, ошибка. Вот почему вам нужна ветка else в примере 2 для удовлетворения компилятора.

Вы можете сделать i == 10 константным выражением, сказав, что i равно final:

final int i = 10;

Таким образом, компилятор знает, что значение i является постоянным, и j всегда будет инициализироваться, а ошибка будет go исчезать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...