Java 異常類別

在程式開發的過程中,常常會遇到一些異想不到的錯誤,例如:

  • 使用者輸入了一個你猜也沒猜到的數值
  • 要把資料寫到檔案裡,但發現磁碟空間不夠
  • 需要連上網路去抓一個檔案,但電腦現在沒有接上網路

無論這些異想不到的錯誤,是屬於使用者造成的,或是使用者的電腦軟硬體造成,Java 將這些狀況,視為例外或是異常,也是 Exception。

Java 將 Exception 分為三個主要的類別:

  • 必須處理的異常(Checked Exception)

  • 程式運作期間的異常(Runtime Exception)

  • 錯誤 (Errors)

必須處理的異常(Checked Exception)

這類型的異常最大的特色是,在編輯期間會強迫開發人員處理,最常見的例子是 FileNotFoundException 找不到檔案的異常,例如想要使用 FileReader 去讀取一個檔案的時候,編譯器(Compiler) 會強迫開發者處理這個異常。

1
2
3
4
5
6
7
8
9
10
11
12
import java.io.File;
import java.io.FileReader;

public class FileNotFound_Demo {

public static void main(String args[]) {
File file = new File("E://file.txt");
// FileReader 建構子會丟出 FileNotFoundException
// 因為這段程式並沒有處理 FileNotFoundException,所以無法編譯
FileReader fr = new FileReader(file);
}
}

程式運作期間的異常(Runtime Exception、 Unchecked Exception)

這類型的異常編譯器並不會強迫開發者處理,所以被稱作為 Unchecked Exception 或是 Runtime Exception。最常見的就是 ArrayIndexOutOfBoundsException。

1
2
3
4
5
6
7
8
public class Unchecked_Demo {

// 這段程式碼是可以編譯,但是執行後會產生 ArrayIndexOutOfBoundsException
public static void main(String args[]) {
int num[] = {1, 2, 3, 4};
System.out.println(num[5]);
}
}

錯誤 (Errors)

錯誤與異常可以說是完全不同的東西,錯誤有幾個特性:

  • 嚴重程度比較高
  • 程式比較難處理的
  • 難以恢復的

常見的例如,透過遞迴解決問題時候要小心的 StackOverFlowError:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

class StackOverflow {
public static void test(int i)
{
// No correct as base condition leads to
// non-stop recursion.
if (i == 0)
return;
else {
test(i++);
}
}
}
public class ErrorEg {

public static void main(String[] args)
{

// eg of StackOverflowError
StackOverflow.test(5);
}
}