Java: запутался в концепции инициализации переменной - PullRequest
3 голосов
/ 17 февраля 2012

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

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

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);
    }
}

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

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


Редактировать:

Я понимаю, что компилятор фактически не проверяет внутри цикла, чтобы увидеть, будет ли переменная инициализирована или неттак что он просто говорит, что не мог быть инициализирован, но тогда почему работает следующий код?Проверяет ли компилятор цикл 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);
    }
}

Редактировать 2:

Похоже, это выдает мне ту же ошибку, если я фактически даю другое условие длячасть else, так что это будет:

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

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

Ответы [ 7 ]

10 голосов
/ 17 февраля 2012

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

5 голосов
/ 17 февраля 2012

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

1 голос
/ 17 февраля 2012

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

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

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

1 голос
/ 17 февраля 2012

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

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

1 голос
/ 17 февраля 2012

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

   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

'Надежда, которая помогает ...

0 голосов
/ 17 февраля 2012

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

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

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

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

Кстати, int = x, y; недопустим синтаксис Java: знак равенства там не принадлежит.

0 голосов
/ 17 февраля 2012

x инициализируется в цикле for (первый аргумент)

...