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+ 瀏覽量

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.