Java
可以利用例外處理的機制協助我們避開或是處理可能發生的錯誤~~
# 簡單的例外處理
我們可以使用 try
、 catch
分別執行程式碼與捕捉代表錯誤的物件,做一些例外的處理。
try{ | |
// 陳述句 | |
}catch(例外型態 名稱){ | |
// 例外處理 | |
} |
public class Average{ | |
public static void main(String[] args){ | |
Scanner console = new Scanner(System.in); | |
double sum = 0; | |
int cnt = 0; | |
while(true)){ | |
try{ | |
int n = console.nextInt(); | |
if( n==0 ) | |
break; | |
sum+=n; | |
cnt++; | |
}catch(InputMismatchException ex){ | |
System.out.printf("略過的輸入為: %s\n",console.next()); | |
} | |
} | |
System.out.printf("輸入的平均為: %.2f\n",sum/cnt); | |
} | |
} |
10 20 3O 40 0 | |
略過的輸入為: 3O | |
輸入的平均為: 23.33 |
從上述範例中, 3O 它並非數字,所以不會進入 try
區塊中做運算,反而到了 catch
區塊中受處理,所以我們能知道:
JVM 會嘗試執行 try
區塊中的程式碼,如果發生錯誤的話,就會跳離流程中的錯誤,然後再對比 catch
區塊中的宣告型態,如果一致的話,就會轉執行 catch 區塊中的程式碼。
# 受檢例外、執行例外
某些例外是可以被預期的,是硬體環境問題導致我們無法正確地取得資料,這種例外就叫做受檢例外,在我們進行編譯的時候,就會出現報錯給我們。
相對的,若是無法預期的例外,就稱作執行時期例外,編譯器本身不需要做處理,最後會交給 JVM
顯示例外堆疊訊息。
public class Check{ | |
public static void main(String[] args){ | |
try{ | |
BuffereadyReader buf = new BuffereadyReader(System.in); | |
System.out.print("請輸入整數"); | |
int n = Integer.parseInt(buf.readLine()); | |
System.out.println("輸入乘十等於: "+ (n*10) ); | |
}catch(IOException e){ // 受檢例外 | |
System.out.print("I/O 錯誤"); | |
}catch(NumberFormatException e){ // 執行期間例外 | |
System.out.print("輸入必須是整數"); | |
} | |
} | |
} |
若此時,將有 IOException
的 catch
區塊拿掉會回報編譯錯誤,因為他是受檢例外。