我们是否可以在finally块中使用return语句。这会引起什么问题吗?
从finally
块内部返回将导致exceptions
丢失。
finally块中的return语句将导致丢弃try或catch块中可能引发的任何异常
根据Java语言规范:
如果由于任何其他原因,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,return语句总是突然完成
是的,您可以在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块中写入返回语句,事实上您不应该写入它。
是的,你可以,但你不应该是1,因为finally块是有特殊用途的。
finally不仅仅用于异常处理,它还允许程序员避免由于返回、继续或中断而意外绕过清理代码。将清理代码放在finally块中始终是一种很好的做法,即使在没有预期异常的情况下也是如此。
不建议在里面写你的逻辑。
您可以在finally
块中写入return
语句,但从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