为什么在循环中看到变量而在循环外部看不到?

Rom*_*man 0 java compiler-errors initialization

我有以下代码:

    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());
Run Code Online (Sandbox Code Playgroud)

编译器抱怨最后一行.它写道"变量tmpBrowser可能尚未初始化".如果我评论最后一行,编译不会抱怨.

Bal*_*usC 5

如果没有players,则tmpBrowser不会以任何方式初始化.编译器无法预测是否有任何玩家.此外,与字段(在方法块外部声明的类/实例变量)相反,局部变量(在方法块内声明)将不会使用默认值进行预初始化.您需要通过自己预先初始化编译器来使编译器满意:

ServiceBrowser tmpBrowser = null;
Run Code Online (Sandbox Code Playgroud)

(不要忘记以前做过零检查getStatus(),否则你可能冒着NPE的风险).