我们可以在finally块中使用 return 语句吗?这会导致任何问题吗?
4 回答
从finally
块内部返回将导致exceptions
丢失。
finally 块中的 return 语句将导致 try 或 catch 块中可能引发的任何异常被丢弃。
如果 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 块中编写 return 语句不是必需的,实际上你不应该编写它。
是的,你可以,但你不应该 1 ,因为 finally 块用于特殊目的。
finally 不仅仅对异常处理有用——它允许程序员避免清理代码被 return、continue 或 break 意外绕过。将清理代码放在 finally 块中始终是一个好习惯,即使没有预料到异常也是如此。
不建议在其中编写逻辑。
您可以在块中编写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);
}
}
你从 main 方法调用它
public static void main(String[] args){
System.out.println(getNumber());
}
这打印
7
5