【发布时间】:2014-08-27 08:32:15
【问题描述】:
我知道创建一个没有 最后阻塞。所以在修改这段代码时,我想不通 什么 Java 逻辑(例如规则、理论)迫使我包含 finally 块 在这段代码中 - 以及为什么 finally 块必须包含一个 return 在里面声明。换句话说,如果我删除 finally 完全阻塞我收到一个错误,如果我替换 return 语句 在 finally 块与其他任何东西(例如 System.out.printl(''foo")),我 仍然收到一个错误,要求我包含一个 return 语句。再次, 此处编写的代码编译并运行良好。我只是想了解 try-catch-finally 构造背后的一些理论(ps 我理解 这都是关于“异常处理”的......但我的问题更多的是关于 代码流和返回语句)。
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());
}
}
【问题讨论】:
-
诀窍是阅读错误信息。没有 finally 块,如果没有异常,该方法返回什么?
-
return 20也可以在 try/catch 之外,在方法的末尾,或者在try块的末尾。不过,上面的做法并没有错。 -
拥有
finally块可以修复编译,但从逻辑上讲这是一个错误。 -
(我的偏好是在方法的末尾。或者在此处添加注释,指出假设
return出现的位置。) -
有人在给你一个诡计问题。 finally 块中的
20将在 catch 块之后执行,是否替换了10? [提示:是] finally 块中的return是合法的,但 是个坏主意。