3

Я новичок в Java, и у меня есть немного проблем с пониманием концепции объявления и инициализации переменных.Java: Confused о концепции инициализации переменных

Например, когда я делаю:

public class Foo { 
    public static void main (String[] args) { 
     int x, y; 
     for (x = 0 ; x < 10 ; x++) { 
      y = x + 1; 
     } 
     System.out.println(x); 
     System.out.println(y); 
    } 
} 

Это не компилирует и говорит, что «переменная у не может быть инициализирован.» Однако у него нет никаких проблем, если я скажу ему просто распечатать значение x после цикла. Конечно, это сработало бы, если бы я просто объявил это в начале (говоря int = 0 или что-то в этом роде), но я хотел знать, почему x напечатан, но не y.

Заранее спасибо!


Edit:

Я понимаю, что компилятор фактически не проверяет внутри цикла, чтобы увидеть, если переменная будет инициализирована или не так просто говорит, что это не может быть инициализирован, но тогда почему работает ли следующий код? Проверяет ли компилятор цикл if, но не цикл for?

public class Foo { 
    public static void main (String[] args) { 
     int x = 0, y; 
     if (x == 0) { 
      y = 1; 
     } 
     else { 
      y = 2; 
     } 
     System.out.println(y); 
    } 
} 

Edit 2:

Похоже, что это дает мне ту же ошибку, если я на самом деле дать еще одно условие для еще части так, что это будет:

if (x == 0) { 
    y = 1; 
} 
else if (x == 1) { 
    y = 2; 
} 

Так Я предполагаю, что другой пример работал, поскольку y был инициализирован как в части if, так и в else, что означает, что y всегда будет инициализироваться независимо от того, какое условие задано. Теперь я действительно понимаю. Спасибо!!

+1

Я предполагаю, что '=' в объявлении - это опечатка – Bozho

+0

@Bozho да, это была опечатка .. Я исправил ее, спасибо! – Dennis

ответ

10

Локальные переменные не имеют значения по умолчанию, и вам необходимо их инициализировать. Вы, конечно, устанавливаете значение x (x=0), но компилятор не проверяет, будет ли тело цикла фактически введено. Поэтому дайте y значение 0.

+0

Это объясняет многое ... так как я думал, что каждому примитивному типу данных будет присвоено значение по умолчанию, если я его не инициализировал, но теперь я знаю, что локальным переменным не присваивается значение по умолчанию. Спасибо!! – Dennis

+0

имеет значение по умолчанию, только если это переменная класса, но местные жители не – Bozho

1

Это неправильно:

public class Foo { 
     public static void main (String[] args) { 
      int = x, y; // Wrong 
      for (x = 0 ; x < 10 ; x++) { 
       y = x + 1; 
      } 
      System.out.println(x); 
      System.out.println(y); 
     } 
    } 

Это правильно:

public class Foo { 
    public static void main (String[] args) { 
     int x, y; // Declaration only: x and y are uninitialized 

Это также верно:

public class Foo { 
    public static void main (String[] args) { 
     int x = 1, y = 10; // Declaration + initialization 

«Надежда, что помогает ...

5

Если вы посмотрите в коде; вы инициализировали x для цикла 0 in for и затем увеличиваете его на x ++. Но вы инициализируете Y внутри цикла, который может выполняться или не выполняться во время выполнения (ничего не связано с временем компиляции). В Java вы должны инициализировать локальную переменную перед ее использованием, и если вы этого не сделаете, компилятор запросит ошибку.И именно поэтому х печатается и не Y

0

Рассмотрим, что может произойти, если ваш цикл был

for (x = 0 ; x < someOtherVariable ; x++) { 

и значение someOtherVariable было равным нулю. Цикл не запускался вообще, поэтому y никогда не будет инициализирован.

Конечно, цикл, который вы написали , будет всегда работать десять раз, так как нижняя и верхняя граница жестко закодированы, но компилятор (по-видимому) не анализирует код, достаточный для доказательства этого. Он видит переменную, которая инициализируется только в цикле, и, следуя общему правилу, что цикл может вообще не выполняться, он жалуется, что переменная не может быть инициализирована.

BTW, int = x, y; Недействительный синтаксис Java: знак равенства там не используется.

1

Невозможно определить до времени выполнения, будет ли цикл for работать один раз. Поэтому эта инициализация не учитывается (т. Е. Компилятор не может зависеть от нее, поэтому это ошибки).

Не может быть определено до тех пор, пока не будет выполнено время, из которого две - if или пункт else - будет срабатывать. Тем не менее, во время компиляции мы знаем, что один ИЛИ другой будет срабатывать, поэтому, если вы инициализируетесь в обоих случаях, ошибка компиляции исчезает.

+1

Да! это была такая простая вещь, но я запутался .. спасибо. – Dennis

+0

@ Dennis рада помочь. В Java, по большей части, сообщения об ошибках сообщают вам все. Это хорошо и не верно на других языках. –

1

Это зависит от двух вещей:

  • не выполняет, независимо от того, что (здесь "х")
  • выполняет на основе некоторого ограничения (здесь "у")

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

Смежные вопросы