我们可以在 finally 块中使用return语句。这会导致任何问题吗?
答案 0 :(得分:41)
从finally
块内返回会导致exceptions
丢失。
finally块中的return语句将导致try或catch块中可能抛出的任何异常被丢弃。
根据Java Language Specification:
如果由于任何其他原因导致try块的执行突然完成 R,然后执行finally块,然后有一个选择:
If the finally block completes normally, then the try statement completes abruptly for reason R. If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).
注意:根据JLS 14.17 - 返回语句总是突然完成。
答案 1 :(得分:25)
是的,您可以在finally块中编写return语句,它将覆盖其他返回值。
编辑:
例如,在下面的代码中
public class Test {
public static int test(int i) {
try {
if (i == 0)
throw new Exception();
return 0;
} catch (Exception e) {
return 1;
} finally {
return 2;
}
}
public static void main(String[] args) {
System.out.println(test(0));
System.out.println(test(1));
}
}
输出始终为2,因为我们从finally块返回2。记住,finally总是执行是否存在异常。所以当finally块运行时,它将覆盖其他的返回值。在finally块中编写return语句不是必需的,实际上你不应该写它。
答案 2 :(得分:3)
是的,你可以,但你不应该1,因为the finally block是出于特殊目的。
最终不仅仅用于异常处理 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。
不建议在其中编写逻辑。
答案 3 :(得分:-2)
您可以在return
块中编写finally
语句,但是try
块返回的值将在堆栈上更新,而不是finally
块返回值。
让我们说你有这个功能
private Integer getnumber(){
Integer i = null;
try{
i = new Integer(5);
return i;
}catch(Exception e){return 0;}
finally{
i = new Integer(7);
System.out.println(i);
}
}
你从主方法
中调用它public static void main(String[] args){
System.out.println(getNumber());
}
打印
7
5