异常(或异常事件)是程序执行期间出现的问题。当异常发生时,程序的正常流程被打乱,程序/应用程序异常终止,这是不推荐的,因此,需要对这些异常进行处理。

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

语法

try {
   // 受保护的代码
} catch (ExceptionName e1) {
   // 捕获异常
} 

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

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

示例 1

在下面的示例中,声明了一个包含 2 个元素的数组。然后代码尝试访问数组的第三个元素,这会引发异常。由于我们用 try 块封装了代码,因此可以在我们声明为捕获 ArrayIndexOutOfBoundsException 的下一个 catch 块中处理此异常。捕获异常后,我们就可以采取相应的操作。这里我们打印抛出异常的详细信息。

package com.yxjc123;

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 (ExceptionType2 e2) {
   // 捕获块
} catch (ExceptionType3 e3) {
   // 捕获块
} 

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

示例 2

这是显示如何使用多个 try/catch 语句的代码段。在此示例中,我们通过将值除以 0 来创建错误。由于它不是 ArrayIndexOutOfBoundsException,因此下一个 catch 块会处理异常并打印详细信息。

package com.yxjc123;

public class ExcepTest {

   public static void main(String args[]) {
      try {
         int a[] = new int[2];
         int b = 0;
         int c = 1/b;
         System.out.println("Access element three :" + a[3]);
      }
      catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("ArrayIndexOutOfBoundsException thrown  :" + e);
      }catch (Exception e) {
          System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
} 

输出

Exception thrown  :java.lang.ArithmeticException: / by zero
Out of the block 

捕获多种类型的异常

从 Java 7 开始,您可以使用单个 catch 块处理多个异常,这一功能简化了代码。以下是具体操作方法 -

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

示例 3

这里的代码段显示了如何在单个语句中使用多个 catch。在此示例中,我们通过将值除以 0 来创建错误。在单个语句中,我们处理 ArrayIndexOutOfBoundsException 和 ArithmeticException。

package com.yxjc123;

public class ExcepTest {

   public static void main(String args[]) {
      try {
         int a[] = new int[2];
         int b = 0;
         int c = 1/b;
         System.out.println("Access element three :" + a[3]);
      }
      catch (ArrayIndexOutOfBoundsException | ArithmeticException e) {
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
} 

输出

Exception thrown  :java.lang.ArithmeticException: / by zero
Out of the block