2

为什么 Java 编译器会在 finally 块中引发“局部变量 s 可能尚未初始化”。我无法弄清楚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)
    }
}
4

5 回答 5

4

java 语言规范的一部分是局部变量必须在使用前显式初始化(​​即在其值被引用之前)。

有些东西Throwables会阻止s被赋予价值——OutOFMemoryError成为其中之一。

给出s一个值将解决编译问题:

String s = null;

需要显式初始化的原因是局部变量使用堆栈内存,而不是堆内存作为实例变量,并且没有构造阶段为变量提供默认值 - 它必须被编码。

于 2012-11-09T13:08:16.747 回答
3

如果第 6 行出现 OutOfMemory-Error,则不能在第 8 行使用。

于 2012-11-09T13:09:50.143 回答
1

这是因为编译器不能保证 100%try块中的分配将毫无问题地运行,并且与catch块类似。如果两个分配都失败了,s当它打印在finally不合法的块中时,它仍然是未初始化的。

于 2012-11-09T13:09:06.617 回答
1

我无法弄清楚 s 在哪个代码流中仍未初始化。

理论上,异常可能会发生在try/catch块中,例如OutOfMemoryExceptions为避免这种情况,您可以使用初始化null

String s = null;
于 2012-11-09T13:09:33.653 回答
1

基本上,在 s 初始化之前,catch 块中可能会出现新的异常。例如 OutOfMemoryError。

于 2012-11-09T13:12:13.307 回答