Почему переменная видна в цикле и не видна вне цикла? - PullRequest
0 голосов
/ 18 марта 2010

У меня есть следующий код:

    String serviceType;
    ServiceBrowser tmpBrowser;
    for (String playerName: players) {
        serviceType = "_" + playerName + "._tcp";
        tmpBrowser = BrowsersGenerator.getBrowser(serviceType);
        tmpBrowser.browse();
        System.out.println(tmpBrowser.getStatus());
    }       
    System.out.println(tmpBrowser.getStatus());

Компилятор жалуется на последнюю строку. Он пишет "переменная tmpBrowser может быть не инициализирована". Если я прокомментирую последнюю строку, компиляция не будет жаловаться.

Ответы [ 4 ]

5 голосов
/ 18 марта 2010

Если нет players, то tmpBrowser не будет инициализироваться никоим образом. Компилятор не может предсказать, есть ли игроки или нет. Кроме того, в отличие от полей (переменные класса / экземпляра, объявленные вне блоков метода), локальные переменные (объявленные внутри блоков метода) не будут предварительно инициализированы значениями по умолчанию. Вам нужно сделать компилятор счастливым, предварительно инициализировав его самостоятельно:

ServiceBrowser tmpBrowser = null;

(не забудьте выполнить нулевую проверку до getStatus(), иначе вы можете рискнуть NPE).

1 голос
/ 18 марта 2010

Если вы никогда не введете цикл for, скажем, когда массив players пуст, переменная tempBrowser останется неинициализированной . Поэтому, чтобы преодолеть это, вам нужно убедиться, что tempBrowser имеет присвоенное ему значение независимо от цикла. Что-то вроде:

ServiceBrowser tmpBrowser = null;

до того, как цикл поможет.

1 голос
/ 18 марта 2010

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

1 голос
/ 18 марта 2010

Если количество элементов в переменной players равно нулю, цикл не будет выполнен, поэтому переменная tmpBrowser никогда не будет инициализирована (даже значение null), когда System.out.println() вызов выполнен.

Единственный способ устранить ошибку - дать значащей переменной по умолчанию для переменной tmpBrowser (хотя бы даже с null, но в этом случае у вас все равно будет NullPointerException, повышенный на tmpBrowser.getStatus()), если Вы не можете избавиться от последнего System.out.println(tmpBrowser.getStatus()); звонка.

...