Java 中 try catch finally 中的流控制

java programming java 8object oriented programming

方法使用 trycatch 关键字的组合来捕获异常。try/catch 块放置在可能产生异常的代码周围。try/catch 块内的代码称为受保护代码,使用 try/catch 的语法如下所示 −

语法

try {
   // 受保护代码
} catch (ExceptionName e1) {
   // Catch 块
}

容易发生异常的代码放置在 try 块中。发生异常时,与其关联的 catch 块将处理发生的异常。每个 try 块后面都应紧跟一个 catch 块或 finally 块。

catch 语句涉及声明您尝试捕获的异常类型。如果受保护的代码中发生异常,则会检查 try 后面的 catch 块(或多个块)。如果发生的异常类型在 catch 块中列出,则异常将传递给 catch 块,就像将参数传递给方法参数一样。

示例

以下是一个声明有 2 个元素的数组。然后代码尝试访问数组的第 3 个元素,这会引发异常。

// 文件名:ExcepTest.java
import java.io.*;

public class ExcepTest {

   public static void main(String args[]) {

      try {
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exception thrown :" + e);
      }
      System.out.println("Out of the block");
   }
}

这将产生以下结果 −

输出

Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

多个 Catch 块

一个 try 块后面可以跟多个 catch 块。多个 catch 块的语法如下所示 −

语法

try {
   // 受保护的代码
} catch (ExceptionType1 e1) {
   // Catch 块
} catch (ExceptionType2 e2) {
   // Catch 块
} catch (ExceptionType3 e3) {
   // Catch 块
}

前面的语句演示了三个 catch 块,但您可以在单个 try 之后拥有任意数量的 catch 块。如果受保护的代码中发生异常,则会将异常抛出到列表中的第一个 catch 块。如果抛出的异常的数据类型与 ExceptionType1 匹配,则会在那里捕获它。如果不是,异常将传递到第二个 catch 语句。这将持续进行,直到异常被捕获或通过所有捕获,在这种情况下,当前方法将停止执行,并将异常抛出到调用堆栈上的前一个方法。

示例

以下代码段展示了如何使用多个 try/catch 语句。

try {
   file = new FileInputStream(fileName);
   x = (byte) file.read();
   } catch (IOException i) {
      i.printStackTrace();
      return -1;
   } catch (FileNotFoundException f) // 无效!{
      f.printStackTrace();
      return -1;
   }

捕获多种类型的异常

从 Java 7 开始,您可以使用单个 catch 块处理多个异常,此功能简化了代码。以下是您可以执行的操作 −

catch (IOException|FileNotFoundException ex) {
   logger.log(ex);
   throw ex;

Finally 块

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

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

finally 块出现在 catch 块的末尾,语法如下 −

语法

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

示例

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

请注意以下 −

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

  • 只要存在 try/catch 块,就不一定要有 finally 子句。

  • 没有 catch 子句或 finally 子句,try 块就不能存在。

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


相关文章