CodeGym /Java Blog /Toto sisi /Java 嘗試-捕獲
John Squirrels
等級 41
San Francisco

Java 嘗試-捕獲

在 Toto sisi 群組發布
程式執行過程中可能會出現錯誤。對於每個程式設計師來說,從初學者到真正的專業人士,這都是一個常見問題。並非所有錯誤都是由開發人員的過錯引起的。其中一些很難預測,有時甚至是不可能的。例如,在下載程式時,網路連線可能會突然斷開或斷電。這種情況稱為例外。Try 和 catch 是用來處理異常的構造部分。

Java try 和 catch 區塊

當發生錯誤時,Java 通常會停止並產生錯誤訊息。這個過程稱為「Java拋出異常」。Java 提供了處理異常的特殊工具。其中之一是 try...catch...finally 建置。這是 try 區塊、catch 區塊和finally 區塊的語法。

//try block
try {
  // Block of code to try
}
//try catch 
catch(Exception e) {
  // Block of code to handle errors
}
finally {
 // Optional block of code 
          }
當 try 區塊中發生異常時,控制權將傳遞給 catch 區塊,後者可以處理異常。如果沒有找到這樣的區塊,則會向使用者顯示未處理的異常訊息,並停止程式的進一步執行。為了防止這種緊急停止,您需要使用 try..catch 區塊。 Java 嘗試 - 擷取 - 1

簡單介紹一下try、catch、finally、 throws關鍵字

Java 中的例外處理是基於在程式中使用下列關鍵字:
  • try-定義可能發生異常的程式碼區塊;
  • catch — 定義處理異常的程式碼區塊;
  • finally — 定義一個可選的程式碼區塊,但如果存在,則無論 try 區塊的結果如何,都會執行。
這些關鍵字用於在程式碼中建立特殊的處理結構:try catch 和 try catch finally}。
  • throw-用於引發異常;
  • throws-用在方法簽章中,警告方法可能會拋出例外。

try-catch 建構的簡單範例

假設我們有一個帶有一些數組的程式。

public class TryTest {
   public static void main(String[] args) {
       int[] myArray = new int[5];
       myArray[7] = 8;
       System.out.println(myArray[7]);
   }
}
由於我們嘗試存取索引不存在的陣列元素,因此程式將退出並出現錯誤:
在執行緒「main」中出現異常 java.lang.ArrayIndexOutOfBoundsException:索引 7 超出長度 5 天的範圍。TryTest.main(TryTest.java:6) 進程已完成,退出程式碼為 1
讓我們修改這個程式並使用 try-catch 處理這個異常。首先是 try 區塊,然後是 catch 區塊。

//try catch example
public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (Exception myEx) {
           System.out.println("The exception was handled...");
       }

       System.out.println("This is the end of the program...");
   }
}
現在輸出已經改變:
異常已處理...這是程式的結尾...進程已完成,退出代碼為 0 進程已完成,退出代碼為 0
在這種情況下,程式正確完成,我們的訊息顯示在螢幕上。程式的正確終止由進程結束時的程式碼 0 表示,而不正確的是 — 1。使用 try...catch 區塊時,首先執行 try 和 catch 語句之間的所有語句。如果try區塊中發生異常,則正常執行順序停止並繼續執行catch語句。因此,當程式執行到numbers[7]=8時;行,程式將停止並轉到 catch 區塊。在我們的例子中,我們宣告了 Exception 類型的變數 myEx。這是所有異常的基類,因此它們可以不同。例如,有些異常會導致堆疊溢位、超出陣列索引(如我們的例子中)指向 Null 等。如果我們沒有猜測異常的類型,那麼程式也會錯誤地終止。但是,為了範例簡單起見,我們選擇了 Exception 類型,它是所有異常的基底類別。所以catch語句(Exception myEx)將處理幾乎所有例外狀況。處理這種情況下的異常 在 catch 區塊完成後,程式繼續其工作,執行 catch 區塊之後的所有其他指令。如果您想查看發生的異常,可以讓程式列印方法呼叫的堆疊追蹤。這就是 JVM 在發生未捕獲的異常時所做的事情:它停止程式的執行,並在執行 finally 區塊的程式碼(如果存在)後列印堆疊追蹤。

public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (Exception myEx) {
          
         myEx.printStackTrace();
       }

       System.out.println("This is the end of the program...");
   }
}
在這種情況下,處理異常歸結為使用Exception類別中定義的printStackTrace()方法將錯誤追蹤堆疊列印到控制台。
java.lang.ArrayIndexOutOfBoundsException:索引 7 在 days.TryTest.main(TryTest.java:7) 超出長度 5 的範圍,這是程式的結尾...進程已完成,退出程式碼為 0
但是,程序正確退出。

最後!抓到後

在範例和異常處理關鍵字的定義中,我們提到了finally 區塊。它是可選的,但如果存在,則無論 try 區塊的結果如何,都會執行它。讓我們將異常類型變更為 NullPointerException。

public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (NullPointerException myEx) {
           System.out.println("The exception was handled...");

       }

       finally{
           System.out.println(" finally");
       }

       System.out.println("This is the end of the program...");
   }
}
這是輸出:
執行緒「main」中出現異常 java.lang.ArrayIndexOutOfBoundsException:索引 7 在 days.TryTest.main(TryTest.java:7) 超出長度 5 的範圍最終進程完成,退出程式碼 1
順便說一下,我們可以指定正確的異常類型。這裡是 IndexOutOfBoundsException。

public class TryTest {
   public static void main(String[] args) {
       try {
           int[] myArray = new int[5];
           myArray[7] = 8;
           System.out.println(myArray[7]);
       } catch (IndexOutOfBoundsException myEx) {
           System.out.println("The exception was handled...");

       }

       finally{
           System.out.println(" finally");
       }

       System.out.println("This is the end of the program...");
   }
}
在這種情況下,輸出將如下:
例外已處理...最後這是程式的結束...進程已完成,退出代碼為 0

異常的工作原理是什麼?

關鍵是所有這些字——catch、 throw、 throws 只能與 java.lang.Throwable 或其後代一起使用。例如,您可以這樣做:

public class MyClass {
    public static void main(String[] args) {
        try {
        } catch (Throwable thr) {
}
    }
}
但是,你不能這樣做:

public class MyClass {
public static void main(String[] args) {
        try {
        } catch (String thr) {
}
    }
}
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION