Выполнение локальных переменных, инициализированных внутри логических блоков во время выполнения?

Почему инициализация локальных переменных внутри логических блоков, таких как if-else, может выполняться или не выполняться во время выполнения в java? Например, см. Код ниже:

 class Test
 {
  public static void main(String args[])
  {
    int x;
    if(args.length>0)
    {
        x=10;
    }
    System.out.print(x);
  }
}

Если я просто компилирую с использованием javac Test.java, он показывает ошибку времени компиляции и при передаче любого аргумента командной строки выводит 10 в качестве вывода.

Можете ли вы показать конкретный пример кода, о котором вы спрашиваете?

Eran 26.10.2018 08:26

Не могли бы вы быть более точными? Может быть, приведите пример выполнения во время выполнения и еще один для противоположной ситуации. Мне непонятно, о чем вы спрашиваете ...

deHaar 26.10.2018 08:27

Вы имеете в виду, если он никогда не попадет в блоки?

achAmháin 26.10.2018 08:28

Вы уверены, что компилятор выдает ошибку? Как бы вы могли выполнить это потом? Может быть, это предупреждение о возможно неинициализированной переменной? Рассмотрим args.length == 0, что бы напечатать в System.out.println(x)?

deHaar 26.10.2018 09:00

@deHaar Нет, это ошибка компилятора, а не предупреждение: ideone.com/Z15GSA

daniu 26.10.2018 09:05

@daniu ОК, хорошо ... речь идет о неинициализированной переменной. В любом случае это должна быть ошибка компиляции.

deHaar 26.10.2018 09:06

@deHaar В случае args.length == 0 работает и output = 10

Shubham Rai 26.10.2018 09:18

@ShubhamRai интересно ... Я сам должен это проверить! В eclipse он напрямую показывает ошибку и отказывается компилироваться ...

deHaar 26.10.2018 09:21
0
8
36
1

Ответы 1

Проблема в вашем коде заключается в том, что для пустого списка аргументов x не будет инициализирован до выполнения System.out.print(x).

Локальные переменные не инициализируются значением по умолчанию, в отличие от переменных-членов; до x = 10 его значение не определено, и вы не можете получить доступ к переменной. Вы можете объявить его как int x = 0, присвоив ему значение по умолчанию.

Дополнительная литература: JLS 14.12.3.7 и JLS 14.12.5

LuCio 26.10.2018 10:13

Другие вопросы по теме