变量未在try catch块`finally`中初始化

时间:2014-10-17 13:52:29

标签: java syntax compiler-errors

为什么编译器不能理解变量是在trycatch块中初始化的 并在finally街区抱怨?

int i;
try {
    i = 0;
}
catch (Exception e) {
    i = 2;
}
finally {
    System.out(i);
}

3 个答案:

答案 0 :(得分:5)

如果初始化语句(i = 0;)失败,那么程序将继续使用finally块,其中变量仍将被取消初始化,这就是编译时出错的原因

答案 1 :(得分:2)

编译器将无法知道i是否会被初始化。它可能因任何原因而失败,因此finally块可能无效。

答案 2 :(得分:2)

如果在初始化之前在catch块中打印变量'i',则会出错,因为编译器认为在try块中设置'i'之前可能会抛出异常,在这种情况下'i'不会被初始化,所以最后就是这种情况,即当你在finally块编译器中打印'i'时,认为在catch块中设置'i'之前可能会抛出异常,在这种情况下'i'将不会被初始化

编译器不理解变量是在try或catch块中初始化的。编译器抱怨因为局部变量应该同时声明和初始化,但是你刚刚声明了它。如果你在任何一个块(try,catch,finally)中使用它而没有初始化编译器抱怨它。试试吧:

    int i;
    try {
        System.out.println(i);
        //i = 0;
    }
    catch (Exception e) {
        System.out.println(i);
        //i = 2;
    }
    finally {
        System.out.println(i);
    }