为什么Java Compiler拒绝编译呢?

时间:2012-11-09 13:06:36

标签: java

为什么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)
    }
}

5 个答案:

答案 0 :(得分:4)

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

Throwables会阻止s获得一个值 - OutOFMemoryError就是其中之一。

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

String s = null;

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

这是因为编译器不能100%保证try块中的赋值运行没有任何问题,并且类似于catch块。如果两个作业都失败,sfinally块中打印时仍然未初始化,这是不合法的。

答案 3 :(得分:1)

  
    

我无法弄清楚哪些代码流仍未被初始化。

  

理论上,try/catch块中可能会发生异常,例如OutOfMemoryException。为避免这种情况,您可以使用s

初始化null
String s = null;

答案 4 :(得分:1)

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