Java 快速導覽 - 例外處理

寫程式難免會有錯誤 (error) ,例如以下程式

class Exception1Demo {
    public static void main(String[] args) {
        String a = "hello"
        System.out.println(a);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:Exception1Demo.java
    功能:示範物件導向的基本觀念 
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯結果如下



這是語法錯誤 (syntax error) ,因為第 3 行少寫了一個分號
String a = "hello"


通常編譯器 (compiler) 會直接幫我們挑出這類的錯誤,並且提供錯誤發生的相關訊息。例如此例中錯誤發生在第 3 行,編譯器告訴我們第 4 行前應該要有分號。


程式有可能會發生三種錯誤,語法錯誤是其中之一,有一種語意錯誤 (semantic error) ,程式會順利執行,但會得到錯誤的結果。如下例
class Exception2Demo {
    public static void main(String[] args) {
        int i = 1;
        int sum = 0;
        while (i < 100) {
            sum += i;
            i++;
        }
        
        System.out.println("1 + 2 + ... + 99 + 100 = " + sum);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:Exception2Demo.java
    功能:示範物件導向的基本觀念 
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯後執行,結果如下



此例中我們想計算 1 到 100 所有正整數的合,正確的結果應該是 5050 ,可是程式卻算出 4950 ,為什麼呢?因為第 5 行
while (i < 100) {


這裡的條件 (condition) 只會讓 sum 加到 99 為止,若 i 等於 100 就會結束迴圈,因此 while 迴圈 (while loop) 的結束條件應該是 i <= 100 或 i < 101 。


語法錯誤會被編譯器直接挑出,而語意錯誤需要依賴程式設計師自己清楚規劃程式的邏輯。另外一種錯誤通常在執行中發生錯誤,例如
class Exception3Demo {
    public static void main(String[] args) {
        System.out.println(1 / 0);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:Exception3Demo.java
    功能:示範物件導向的基本觀念 
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯如下



錯誤發生在第 3 行
System.out.println(1 / 0);


這裡是發生了除以 0 的致命錯誤,類似這樣的錯誤被稱為例外 (exception) 。


事實上,凡是有可能發生例外的方法 (method) , Java 要求定義方法時必須拋出例外。我們自己使用拋出例外的方法時,必須放在 try-catch 陳述 (statement) 之中, try-catch 都是關鍵字 (keyword) 之一,專門用作例外處理 (exception handling) 。


如果沒有設置 try-catch 的程式區塊 (block) ,編譯器會提出警告,例如
class Exception4Demo {
    public static void main(String[] args) {
        byte[] data = new byte[18];
        for (byte i : data) {
            i = 0;
        }
        
        System.out.println("something: ");
        System.in.read(data);
        
        System.out.println(data);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:Exception4Demo.java
    功能:示範物件導向的基本觀念 
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯如下



第 9 行
System.in.read(data);


in 為 System 類別 (class) 的 static 屬性 (field) ,其為 InputStream 型態 (type) 的物件 (object) , read() 為 in 從標準輸入串流接受輸入的方法,由於這個方法會拋出 IOException 型態的例外,因此編譯器提出警告,程式也沒有順利編譯為執行程式。


out 也是 System 類別的 static 屬性,其為 PrintStream 型態的物件。


中英文術語對照
錯誤error
語法錯誤syntax error
編譯器compiler
語意錯誤semantic error
條件condition
while 迴圈while loop
例外exception
方法method
陳述statement
關鍵字keyword
例外處理exception handling
區塊block
類別class
屬性field
型態type
物件object






沒有留言: