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 |
沒有留言:
張貼留言