錯誤與例外

Java 的資料型別與例外狀況

Jim White

Java Developer

例外 vs 錯誤

  • Error 是嚴重的問題
  • 應用程式無法自行處理並復原錯誤
    • 錯誤會讓應用程式「當掉」或停止
    • 例如:記憶體不足在 Java 中是錯誤
  • 應用程式可以處理並從例外復原
    • 嘗試存取超出陣列大小的元素屬於例外。
Java 的資料型別與例外狀況
錯誤範例
import java.util.*;

public class CauseOutOfMemory {
    public static void main(String[] args) {
        List<Long> numbers = new ArrayList<Long>();
        long counter = 0;
        while (true) {
            numbers.add(counter);
            counter++;
        }
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.base/java.lang.Long.valueOf(Long.java:1204)
    at foo/exceptions.CauseOutOfMemory.main(CauseOutOfMemory.java:12)
Java 的資料型別與例外狀況

兩類例外

受檢例外(Checked) 執行期(「Unchecked」)例外
需要處理
一般成因 超出我們可控範圍的事情 我們的程式錯誤
可否復原 若事先預期通常可復原 通常無法復原
復原機制 try/catch 或 throws 最好小心撰寫以避免發生
例子 找不到檔案 陣列索引越界
Java 的資料型別與例外狀況

受檢與執行期例外

  • 不是 RuntimeException 子類別的 Exception 子類別為「受檢例外」
    • 必須處理(亦即要被攔截或宣告)
    • 例:找不到檔案(FileNotFoundException
  • RuntimeException 是所有「未受檢例外」的父類別
    • 不要求處理
    • 例:存取不存在的陣列索引(IndexOutOfBoundsException
    • 例:以 0 做除數(ArithmeticException
Java 的資料型別與例外狀況

RuntimeException

RuntimeException 子類別 何時拋出說明
ArithmeticException 錯誤的運算,例如除以 0
IndexOutOfBoundsException 用在陣列、字串等的索引超出範圍
NegativeArraySizeException 嘗試建立負大小的陣列
int y = 5/0; // 會造成 ArithmeticException 的程式碼
int[] list = new int[-1];  // 會造成 NegativeArraySizeException 的程式碼
Exception in thread "main" java.lang.ArithmeticException: / by zero
Exception in thread "main" java.lang.NegativeArraySizeException: -1
1 See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/RuntimeException.html
Java 的資料型別與例外狀況

「受檢」例外

public class LoadClass {
    public static void main(String[] args) {
        Class myClass = Class.forName("com.mysql.Driver");
    }
}
LoadClass.java:3: error: unreported exception ClassNotFoundException; 
must be caught or declared to be thrown
                Class myClass = Class.forName("com.mysql.Driver");
                                             ^
1 error
1 See https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Exception.html
Java 的資料型別與例外狀況

一起來練習吧!

Java 的資料型別與例外狀況

Preparing Video For Download...