54

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

4

4 回答 4

72

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 语句总是突然完成。

于 2013-08-13T09:39:51.240 回答
42

是的,您可以在 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 语句不是必需的,实际上你不应该编写它。

于 2013-08-13T09:35:02.303 回答
6

是的,你可以,但你不应该 1 ,因为 finally 块用于特殊目的。

finally 不仅仅对异常处理有用——它允许程序员避免清理代码被 return、continue 或 break 意外绕过。将清理代码放在 finally 块中始终是一个好习惯,即使没有预料到异常也是如此。

不建议在其中编写逻辑。

于 2013-08-13T09:40:18.057 回答
-1

您可以在块中编写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
于 2013-08-13T09:36:03.230 回答