Java 中 try catch finally 的流程控制


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

语法

try {
   // Protected code
} catch (ExceptionName e1) {
   // Catch block
}

易于产生异常的代码放在try块中。当发生异常时,该异常由与其关联的catch块处理。每个try块都应该紧跟一个catch块或finally块。

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

示例

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

// File Name : 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 {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}

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

示例

这是一个代码段,展示了如何使用多个try/catch语句。

try {
   file = new FileInputStream(fileName);
   x = (byte) file.read();
   } catch (IOException i) {
      i.printStackTrace();
      return -1;
   } catch (FileNotFoundException f) // Not valid! {
      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 {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}finally {
   // The finally block always executes.
}

示例

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

注意以下几点:

  • catch子句不能没有try语句。

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

  • try块不能没有catch子句或finally子句。

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

更新于:2020年6月21日

7000+ 浏览量

开启您的职业生涯

完成课程获得认证

开始学习
广告