我知道创建一个没有的try-catch段是有效的 终于阻止了。因此,在使用此代码进行黑客攻击时,我无法理解 什么java逻辑(例如规则,理论)迫使我包括finally块 在这段代码中 - 以及为什么finally块必须包含一个返回 声明。换句话说,如果我删除了finally 完全阻止我收到错误,如果我替换return语句 在finally块中使用其他任何东西(例如System.out.printl('' foo")),I 仍然收到一个错误,坚持我包含一个return语句。再次, 这里编写的代码编译并运行正常。我只是想了解一下 try-catch-finally构造背后的一点理论(p.s.我理解 它的所有关于"异常处理" ...但我的问题更多的是关于 代码流和返回语句。)
class foo {
int getInt() {
try {
String[] students = {"student1", "student2"};
System.out.println(students[4]);
}
catch (Exception e) {
return 10;
}
finally {
return 20;
}
}
public static void main(String args[]) {
foo classSize = new foo();
System.out.println(classSize.getInt());
}
}
答案 0 :(得分:7)
考虑没有finally
int getInt() {
try {
String[] students = {"student1", "student2"};
System.out.println(students[4]);
// no return
}
catch (Exception e) {
return 10; // if an exception occurs
}
// no return
}
那么如果没有抛出异常会发生什么?您将没有返回值。
您可以提供finally
并在那里返回,也可以在try-catch
区块之外返回。
请注意,finally
块中的try-catch-finally
有一个return
语句,该语句将取代catch
的{{1}}语句,因为return
如果执行了关联的finally
,则始终执行block。您可能想要使用以下
try[-catch]
所有执行路径必须最终返回一个值(或抛出异常)。