我有以下代码:
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可能尚未初始化”。如果我评论最后一行,编译不会抱怨。
答案 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;
在循环之前会有所帮助。