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

时间:2010-03-18 14:56:57

标签: java initialization compiler-errors

我有以下代码:

    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 个答案:

答案 0 :(得分:5)

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

ServiceBrowser tmpBrowser = null;

(不要忘记在getStatus()之前进行空检查,否则你可能冒着NPE的风险。)

答案 1 :(得分:1)

如果players变量中的元素数为零,则不会执行循环,因此tmpBrowser变量永远不会被初始化(甚至不是null值)执行System.out.println()调用时。

解决错误的唯一方法是给tmpBrowser变量一个有意义的默认值(即使只有null,但你仍然会NullPointerException引发tmpBrowser.getStatus()在这种情况下)如果你无法摆脱最后的System.out.println(tmpBrowser.getStatus());电话。

答案 2 :(得分:1)

因为如果玩家是一个空集合,它真的可能没有被初始化。

答案 3 :(得分:1)

如果您从未输入for循环,请说当players数组为空时,变量tempBrowser将保持 未初始化 。因此,要解决此问题,您需要确保tempBrowser具有分配给它的值,而不管循环如何。类似的东西:

ServiceBrowser tmpBrowser = null;
在循环之前

会有所帮助。