跳转到内容

Java 编程/关键字/finally

来自维基教科书,开放的书籍,构建开放的世界

finally 是一个关键字,它是 try 块的可选结尾部分。

Example 代码部分 1: try 块。
try {
  // ...
} catch (MyException1 e) {
  // Handle the Exception1 here
} catch (MyException2 e) {
  // Handle the Exception2 here
} finally {
  // This will always be executed no matter what happens
}

finally 块中的代码将始终执行。即使在 try 块中存在异常或执行 return 语句,这种情况也是如此。

try 块中可能发生三种情况。首先,没有抛出异常

Example 代码部分 2: 没有抛出异常。
System.out.println("Before the try block");
try {
  System.out.println("Inside the try block");
} catch (MyException1 e) {
  System.out.println("Handle the Exception1");
} catch (MyException2 e) {
  System.out.println("Handle the Exception2");
} finally {
  System.out.println("Execute the finally block");
}
System.out.println("Continue");
Standard input or output 代码部分 2 的控制台
Before the try block
Inside the try block
Execute the finally block
Continue

您可以看到我们已通过 try 块,然后我们已执行 finally 块,并已继续执行。现在,抛出了一个捕获的异常:|

Example 代码部分 3: 抛出了一个捕获的异常。
System.out.println("Before the try block");
try {
  System.out.println("Enter inside the try block");
  throw new MyException1();
  System.out.println("Terminate the try block");
} catch (MyException1 e) {
  System.out.println("Handle the Exception1");
} catch (MyException2 e) {
  System.out.println("Handle the Exception2");
} finally {
  System.out.println("Execute the finally block");
}
System.out.println("Continue");
Standard input or output 代码部分 3 的控制台
Before the try block
Enter inside the try block
Handle the Exception1
Execute the finally block
Continue


我们已通过 try 块,直到发生异常的位置,然后我们已执行匹配的 catch 块、finally 块,并已继续执行。现在,抛出了一个未捕获的异常

Example 代码部分 4: 抛出了一个未捕获的异常。
System.out.println("Before the try block");
try {
  System.out.println("Enter inside the try block");
  throw new Exception();
  System.out.println("Terminate the try block");
} catch (MyException1 e) {
  System.out.println("Handle the Exception1");
} catch (MyException2 e) {
  System.out.println("Handle the Exception2");
} finally {
  System.out.println("Execute the finally block");
}
System.out.println("Continue");
Standard input or output 代码部分 4 的控制台
Before the try block
Enter inside the try block
Execute the finally block


我们已通过 try 块,直到发生异常的位置,并已执行 finally 块。没有代码在 try-catch 块之后执行。如果在 try-catch 块之前发生异常,则不会执行 finally 块。

如果在 finally 中使用 return 语句,它将覆盖 try-catch 块中的 return 语句。例如,结构

Example 代码部分 5: Return 语句。
 try {
   return 11;
 }  finally {
   return 12;
 }

将返回 12,而不是 11。专业的代码几乎不包含更改执行顺序的语句(如 returnbreakcontinue)在 finally 块中,因为这样的代码更难阅读和维护。

另请参阅

华夏公益教科书