Java 简明教程

Java - Finally Block

The finally Block in Java

最终于块紧跟 a try block or a catch block 后。无论是否发生异常,最终于块的代码都会始终执行。

使用 finally 块允许你运行你想要执行的任何清理类型语句,无论受保护代码中发生什么。

Syntax: Finally Block

finally 块出现在 catch 块的末尾并且具有以下语法 −

try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}finally {
   // The finally block always executes.
}

Points To Remember While Using Finally Block

  1. catch 子句不能没有 try 语句。

  2. try/catch 块出现时,不必有 finally 子句。

  3. 如果没有 catch 子句或 finally 子句,则不能出现 try 块。

  4. 任何代码不能出现在 try、catch、finally 块之间。

  5. 如果在 finally 块之前调用 exit() 方法,或者在程序执行中出现致命错误,则不会执行 finally 块。

  6. finally 块会执行,即使方法在 finally 块之前返回一个值。

Why Java Finally Block Used?

  1. Java finally 块可用于清理(关闭)在退出程序前必须关闭的连接、打开的文件、流等。

  2. 它还可用于打印一些最终信息。

Java Finally Block Example

以下代码段展示了如何在处理异常后在 try/catch 语句后使用 finally。在此示例中,我们创建了一个错误,即使用无效的索引访问数组元素。catch 块正在处理异常并输出它。现在在 finally 块中,我们正在输出一条语句,表示 finally 块正在执行。

package com.tutorialspoint;

public class ExcepTest {

   public static void main(String args[]) {
      int a[] = new int[2];
      try {
         System.out.println("Access element three :" + a[3]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exception thrown  :" + e);
      }finally {
         a[0] = 6;
         System.out.println("First element value: " + a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}
Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

More Examples

Example 1

以下代码段展示了即使未处理异常,如何使用 finally 块在 try/catch 语句之后。在此示例中,我们创建了一个错误,即使用无效的索引访问数组元素。由于 catch 块没有处理异常,我们可以在输出中检查 finally 块正在输出一条语句来表示 finally 块正在执行。

package com.tutorialspoint;

public class ExcepTest {

   public static void main(String args[]) {
      int a[] = new int[2];
      try {
         System.out.println("Access element three :" + a[3]);
      } catch (ArithmeticException e) {
         System.out.println("Exception thrown  :" + e);
      }finally {
         a[0] = 6;
         System.out.println("First element value: " + a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}
First element value: 6
The finally statement is executed
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at com.tutorialspoint.ExcepTest.main(ExcepTest.java:8)

Example 2

以下代码段展示了如何使用 finally 块,其中一个方法可以在 try 块中返回一个值。在此示例中,我们在 try 块中返回一个值。我们可以在输出中检查,即使方法向调用函数返回一个值,finally 块也会输出一条语句,表示 finally 块正在执行。

package com.tutorialspoint;

public class ExcepTest {

   public static void main(String args[]) {
      System.out.println(testFinallyBlock());
   }

   private static int testFinallyBlock() {
      int a[] = new int[2];
      try {
         return 1;
      } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("Exception thrown  :" + e);
      }finally {
         a[0] = 6;
         System.out.println("First element value: " + a[0]);
         System.out.println("The finally statement is executed");
      }
      return 0;
   }
}
First element value: 6
The finally statement is executed
1