Java 異常處理

什麼是例外?

異常是一箇中斷正常執行流程的事件。這是 Java 程式執行期間的中斷。

在本教程中,你將學習 -

  • 什麼是例外?
  • 為什麼我們需要例外?
  • 如何處理例外
  • try...catch
  • Java 異常類層次結構
  • Java Finally Block

有兩種型別的錯誤:

  1. 編譯時間錯誤
  2. 執行時錯誤

編譯時錯誤可以再次分類為兩種型別:

  • 語法錯誤
  • 語義錯誤

語法錯誤示例:

假如你不是用 int a;,而是錯誤地用 in a;,那麼編譯器會丟擲錯誤。

示例:你已宣告變數 int a; 並在一些程式碼行之後再次將整數宣告為 int a; 。編譯程式碼時會突出顯示所有這些錯誤。

執行時錯誤示例

執行時錯誤稱為異常錯誤。任何事件都會中斷正常的程式執行流程。

例外的例子有,算術異常,Nullpointer 異常,除零異常等。

Java 中的異常是開發人員無法控制的。

為什麼我們需要 Exception?

假設你已編寫了一個程式來訪問伺服器。在開發程式碼時,工作正常。

在實際生產執行期間,伺服器已關閉。當你的程式嘗試訪問它時,會引發異常。

如何處理異常

到目前為止,我們已經看到,異常超出了開發人員的控制範圍。但是將程式碼失敗歸咎於環境問題並不是解決方案。你需要一個強大的程式設計,它可以處理異常情況。這樣的程式碼稱為異常處理程式。

在我們的示例中,當伺服器關閉時,良好的異常處理將連線到備份伺服器。

要實現此功能,請輸入你的程式碼以連線到伺服器(使用傳統的 if 和 else 條件)。

你將檢查伺服器是否已關閉。如果是,請編寫程式碼以連線到備份伺服器。

當你的程式碼有多個 java 異常要處理時,使用 ifelse 迴圈的這種程式碼組織無效。

class connect{
    if(Server Up){
     //code to connect to server
    }
    else{
     //code to connect to BACKUP server
    }
}

try...catch 語法

Java 提供內建的特殊處理。

  1. 正常程式碼進入 try 塊。
  2. 異常處理程式碼進入 catch
class connect {
	try {
		// code to connect to the server
	}
	
	catch {
		// code to connect ot backup server
	}
}		

在我們的示例中,try 塊將包含連線到伺服器的程式碼。 catch 塊將包含連線到備份伺服器的程式碼。

如果伺服器已啟動,將忽略 catch 塊中的程式碼。如果伺服器關閉,則會引發異常,並且將執行 catch 塊中的程式碼。

所以,這就是 Java 中處理異常的方式。

使用 try…catch 的語法

try{
    statement(s)
}
catch (exceptiontype name){
    statement(s)
}

步驟 1: 將以下程式碼複製到編輯器中

class JavaException {
   public static void main(String args[]){
      int d = 0;
      int n = 20;
      int fraction = n/d;
     System.out.println("End Of Main");
   }
}

步驟 2: 儲存檔案並編譯程式碼。使用 java JavaException 命令執行程式

步驟 3: 算術異常 - 除以零如下所示,對於行#5 和行#6 從不執行

步驟 4: 現在讓我們看看 try 和 catch 將如何幫助我們處理這個異常。我們將把導致程式碼行的異常放入 try 塊,然後是 catch 塊。將以下程式碼複製到編輯器中。

class JavaException {
 public static void main(String args[]) {
  int d = 0;
  int n = 20;
  try {
   int fraction = n/d;
   System.out.println("This line will not be Executed");
  } catch (ArithmeticException e) {
   System.out.println("In the catch Block due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

步驟 5: 儲存、編譯和執行程式碼。你將獲得以下輸出

C:\workspace\java JavaException
In the catch clock due to Exception = java.lang.ArithmeticException: / by zero
End of main

如你所見,處理異常,並執行最後一行程式碼。另請注意,Line #7 將不會被執行,因為一旦異常被引發,控制流就會跳轉到 catch 塊。

注意: AritmeticException 物件 e 包含有關已發生的異常的資訊,該異常可用於執行恢復操作。

Java 異常類層次結構

在執行一個 catch 語句之後,繞過其他語句,並在 try/catch 塊之後繼續執行。巢狀的 catch 塊遵循 Exception 層次結構。

Java 異常層次結構指南

  • Java 中的所有異常類都擴充套件了類 Throwable。Throwable 有兩個子類,Error 和 Exception
  • Error 類定義了我們的程式在正常情況下不會發生的異常或問題,例如記憶體錯誤、硬體錯誤、JVM 錯誤等
  • Exception 類表示我們的程式可以處理的異常,我們的程式可以使用 try 和 catch 塊從這個異常中恢復
  • 執行時異常是異常類的子類。這些型別的異常表示在執行時發生的異常,並且在編譯時無法跟蹤。一個很好的例子是除零異常,或空指標異常等
  • 在輸入和輸出操作期間生成 IO 異常
  • 在多執行緒期間生成 Java 中斷的異常。

**示例:**瞭解 try 和 catch 塊的巢狀

步驟 1: 將以下程式碼複製到編輯器中。

class JavaException {
 public static void main(String args[]) {
  try {
   int d = 1;
   int n = 20;
   int fraction = n/d;
   int g[] = {
    1
   };
   g[20] = 100;
  }
  /*catch(Exception e){
    System.out.println("In the catch clock due to Exception = "+e);
  }*/
  catch (ArithmeticException e) {
   System.out.println("In the catch clock due to Exception = " + e);
  } catch (ArrayIndexOutOfBoundsException e) {
   System.out.println("In the catch clock due to Exception = " + e);
  }
  System.out.println("End Of Main");
 }
}

步驟 2: 儲存檔案並編譯程式碼。使用命令 java JavaException 執行程式。

步驟 3: 生成 ArrayIndexOutOfBoundsException。將整數 d 的值更改為 0.儲存,編譯並執行程式碼。

步驟 4 生成了 ArithmeticException

步驟 5: 取消註釋#10 行到#12 行。儲存、編譯和執行程式碼。

步驟 6 編譯錯誤?這是因為 Exception 是 ArithmeticException 異常的基類。ArithmeticException 引發的任何 Exception 都可以由 Exception 類處理。因此,ArithmeticException 的 catch 塊永遠不會被執行,這使得它變得多餘。因此編譯錯誤。

Java finally 語句

無論 try 塊中出現異常,都會執行 finally 語句。finallytry 語句的可選項。

 try {
  statement(s)
 } catch (ExceptiontType name) {
  statement(s)
 } finally {
  statement(s)
 }

如果在 try 塊中引發異常,則在執行 catch 塊之後執行 finally 塊。

步驟 1: 將以下程式碼複製到編輯器中。

class JavaException {
   public static void main(String args[]){
    try{
       int d = 0;
       int n =20;
       int fraction = n/d;
    }
  catch(ArithmeticException e){
    System.out.println("In the catch clock due to Exception = "+e);
  }
  finally{
    System.out.println("Inside the finally block");
  }
}
}

步驟 2: 儲存、編譯和執行程式碼。

步驟 3: 預期輸出。最後,即使引發異常,也會執行塊。

步驟 4: 更改變數 d = 1 的值。儲存,編譯並執行程式碼並觀察輸出。表單底部

摘要

  • 異常是執行時錯誤,它會中斷程式執行的正常流程。執行程式期間的中斷稱為錯誤或異常。
  • 錯誤分為兩類
  • 編譯時間錯誤 - 語法錯誤,語義錯誤
  • 執行時錯誤 - 異常
  • 一個強大的程式應該處理所有異常並繼續其正常的程式執行流程。Java 提供了一種內建的特殊處理方法
  • 異常處理程式是一組處理異常的程式碼。可以使用 try&catch 在 Java 中處理異常。
  • try 語句:正常程式碼在此塊上。
  • catch 語句:如果正常程式碼中有錯誤,那麼它將進入此塊