关于java:我们可以在finally块中使用“return”

Can we use “return” in finally block

本问题已经有最佳答案,请猛点这里访问。

我们可以在finally块中使用return语句。 这会导致任何问题吗?


finally块内部返回将导致exceptions丢失。

finally块中的return语句将导致可能在try或catch块中抛出的任何异常被丢弃。

根据Java语言规范:

If execution of the try block completes abruptly for any other reason
R, then the finally block is executed, and then there is a choice:

1
2
3
4
5
6
   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 - 返回语句总是突然完成。


是的,您可以在finally块中编写return语句,它将覆盖其他返回值。

编辑:
例如,在下面的代码中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 is useful for more than just exception handling — it allows the programmer to avoid having cleanup code accidentally bypassed by a return, continue, or break. Putting cleanup code in a finally block is always a good practice, even when no exceptions are anticipated.

不建议在其中编写逻辑。


您可以在finally块中写入return语句,但是从try块返回的值将在堆栈上更新,而不是finally块返回值。

我们假设你有这个功能

1
2
3
4
5
6
7
8
9
10
11
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方法调用它

1
2
3
public static void main(String[] args){
   System.out.println(getNumber());
}

这打印

1
2
7
5