【发布时间】:2014-12-13 03:07:12
【问题描述】:
为什么编译器不理解变量是在try 或catch 块中初始化的
并在finally 块抱怨?
int i;
try {
i = 0;
}
catch (Exception e) {
i = 2;
}
finally {
System.out(i);
}
【问题讨论】:
标签: java syntax compiler-errors
为什么编译器不理解变量是在try 或catch 块中初始化的
并在finally 块抱怨?
int i;
try {
i = 0;
}
catch (Exception e) {
i = 2;
}
finally {
System.out(i);
}
【问题讨论】:
标签: java syntax compiler-errors
如果初始化语句 (i = 0;) 失败,则程序将继续执行 finally 块,其中变量仍将未初始化,这就是您收到编译时错误的原因。
【讨论】:
finally 需要在 catch 之前执行
catch 应该在finally 之前运行那么为什么编译会报错
如果你在初始化之前在 catch 块中打印变量“i”,它会给出错误,因为编译器认为在 try 块中设置“i”之前可能会引发异常,在这种情况下,“i”不会被初始化,所以finally 是这种情况,即当您在 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);
}
【讨论】:
编译器无法知道i 是否会被初始化。它可能因任何原因而失败,因此 finally 块可能无法正常工作。
【讨论】: