我知道它是有效的创建一个try-catch段没有finally块。所以在破解这些代码的过程中,我无法找到答案Java逻辑(例如规则,理论)迫使我包含finally块在这段代码中-以及为什么finally块必须包含返回声明在里面。换句话说,如果我去掉最后一个我收到一个错误,如果我替换返回语句在finally块中与其他任何东西(例如System.out.printl(" foo")), I仍然收到一个错误,坚持要求我包含返回语句。再一次。这里编写的代码可以很好地编译和运行。我只是想弄明白try-catch-finally结构背后的一点理论(附:我理解这都是关于"异常处理"…但我的问题更多的是关于代码流和返回语句)。
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
的执行路径
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
块之外放置返回值。
请注意,try-catch-finally
块中的finally
有一个return
语句,它将取代catch
的return
语句,因为finally
块总是在其相关的try[-catch]
执行时执行。您可能想要使用以下
int getInt() {
try {
String[] students = {"student1", "student2"};
System.out.println(students[4]);
// the return could be here as well
}
catch (Exception e) {
return 10; // in case of failure
}
return 20; // in case of success
}
所有的执行路径必须最终返回一个值(或者抛出一个异常)。