为什么编译器不知道该变量已在try
或catch
块 中初始化,并且在finally
块处抱怨?变量未在try catch块中初始化`finally`
int i;
try {
i = 0;
}
catch (Exception e) {
i = 2;
}
finally {
System.out(i);
}
为什么编译器不知道该变量已在try
或catch
块 中初始化,并且在finally
块处抱怨?变量未在try catch块中初始化`finally`
int i;
try {
i = 0;
}
catch (Exception e) {
i = 2;
}
finally {
System.out(i);
}
如果在初始化之前在catch块中打印变量'i',它会给出错误,因为编译器认为可能在'i'在try块中被设置之前抛出异常,在这种情况下'i'不会被初始化终于在这里也就是这种情况,也就是说,当你在finally块中编译'i'时,编译器认为'i'被设置在catch块之前可能会抛出异常,在这种情况下'i'不会被初始化'
编译器不知道该变量是在try或catch块中初始化的。编译器抱怨,因为应该同时声明和初始化局部变量,但是你已经声明了它。如果你在任何一个block中使用它(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);
}
如果初始化语句(i = 0;
)失败,那么该计划将继续与finally
块,其中变量仍然是未初始化的,这就是为什么你会得到一个编译时错误。
编译器将无法知道i
是否会被初始化。它可能因任何原因失败,因此finally
块可能无法工作。
OMG面掌客当然'需要你为什么说finally块将捕捉之前预制要在'catch' – forcewill 2014-10-17 13:59:03
之前执行finally'? http://stackoverflow.com/questions/3109353/what-comes-first-finally-or-catch-block – Ian2thedv 2014-10-17 14:08:22
@ Ian2thedv,谢谢。你是对的。我的错误 – 2014-10-17 14:09:30