为什么编译器不能理解变量是在try
或catch
块中初始化的
并在finally
街区抱怨?
int i;
try {
i = 0;
}
catch (Exception e) {
i = 2;
}
finally {
System.out(i);
}
答案 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);
}