finally 块位于 try 块或 catch 块之后。无论是否发生异常,finally 代码块始终都会执行。

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

finally 块出现在 catch 块的末尾,具有以下语法 

语法

try {
   // 受保护的代码
} catch (ExceptionType1 e1) {
   // 捕获块
} catch (ExceptionType2 e2) {
   // 捕获块
} catch (ExceptionType3 e3) {
   // 捕获块
}finally {
   //finally 块始终执行。
} 

要记住的要点

  • 如果没有 try 语句,catch 子句就不能存在。

  • 每当 try/catch 块出现时,并不强制必须有 finally 子句。

  • 如果没有catch 子句或finally 子句,try 块就不能出现。

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

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

  • 即使方法在finally块之前返回一个值,finally块也会被执行。

示例1

这里代码段显示了如何在处理异常后在 try/catch 语句之后使用finally。在此示例中,我们使用无效索引访问数组元素时产生错误。 catch 块正在处理异常并打印相同的异常。现在在finally块中,我们打印一条语句,表示finally块正在执行。

package com.yxjc123;

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 

示例2

这里是显示代码段如何在 try/catch 语句之后使用finally,即使异常没有被处理。在此示例中,我们使用无效索引访问数组元素时产生错误。由于 catch 块不处理异常,我们可以在输出中检查finally 块正在打印一条语句,表示finally 块正在执行。

package com.yxjc123;

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.yxjc123.ExcepTest.main(ExcepTest.java:8) 

示例 3

这是显示如何使用finally 块的代码段,其中方法可以在try 块中返回值。在此示例中,我们在 try 块中返回一个值。我们可以在输出中检查finally块正在打印一条语句,表明即使方法将值返回给调用者函数之后,finally块也会被执行。

package com.yxjc123;

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