为什么Java编译器会引发"本地变量s可能尚未初始化"在finally块中。我无法弄清楚哪个代码流, s 仍然未初始化。
public static void test() {
String s;
try {
s = "abc";
} catch (Throwable e) {
s = "throwable";
} finally {
System.out.println(s.getClass()); //---->(The local variable s may not have been initialized)
}
}
答案 0 :(得分:4)
java语言规范的一部分是必须在使用之前(即在引用其值之前)显式初始化局部变量。
有Throwables
会阻止s
获得一个值 - OutOFMemoryError
就是其中之一。
给s
一个值将解决编译问题:
String s = null;
需要显式初始化的原因是局部变量使用堆栈内存,而不是堆内存和实例变量,并且没有构造阶段为变量赋予默认值 - 它必须被编码。
答案 1 :(得分:3)
如果第6行出现OutOfMemory-Error,则不能在第8行使用。
答案 2 :(得分:1)
这是因为编译器不能100%保证try
块中的赋值运行没有任何问题,并且类似于catch
块。如果两个作业都失败,s
在finally
块中打印时仍然未初始化,这是不合法的。
答案 3 :(得分:1)
我无法弄清楚哪些代码流仍未被初始化。
理论上,try/catch
块中可能会发生异常,例如OutOfMemoryException
。为避免这种情况,您可以使用s
null
String s = null;
答案 4 :(得分:1)
基本上,在初始化s之前,catch块中可能会有一个新的异常。例如OutOfMemoryError。