Java 的資料型別與例外狀況
Jim White
Java Developer
Error 是嚴重的問題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)
| 受檢例外(Checked) | 執行期(「Unchecked」)例外 | |
|---|---|---|
| 需要處理 | 是 | 否 |
| 一般成因 | 超出我們可控範圍的事情 | 我們的程式錯誤 |
| 可否復原 | 若事先預期通常可復原 | 通常無法復原 |
| 復原機制 | try/catch 或 throws | 最好小心撰寫以避免發生 |
| 例子 | 找不到檔案 | 陣列索引越界 |
RuntimeException 子類別的 Exception 子類別為「受檢例外」FileNotFoundException)RuntimeException 是所有「未受檢例外」的父類別IndexOutOfBoundsException)ArithmeticException)| 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
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
Java 的資料型別與例外狀況