程序中總避免不了出現各種意想不到的狀況引發的錯誤,java中的錯誤以對象方式呈現爲java.lang.Throwable的各種子類實例.
只要我們能捕捉包裝錯誤的對象,就可以針對改錯誤做一些處理,如,試恢復正常流程,進行日誌記錄,以某種形式提醒用戶.
話不多說,下來我們看一個簡單的例子!
1.用戶可以連續輸入整數,最後輸入0結束後會顯示輸入數的平均值
package dongmengyuan;
/**
* Created by dongmengyuan on 16-11-23.
*/
import java.util.Scanner;
public class Average {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double sum = 0;
int count = 0;
while(true) {
int number = input.nextInt();
if(number == 0) {
break;
}
sum += number;
count++;
}
System.out.printf("平均 %.2f%n",sum/count);
}
}
正確輸入每個整數,輸出預期結果:
輸入錯誤的話,
錯誤第一行,Exception in thread “main” java.util.InputMismatchException.
Scanner對象的nextInt()方法,可以將用戶輸入的下一個字符串剖析爲int值,出現這個錯誤信息,表示不符合Scanner對象預期.
java中所有錯誤都被打包爲對象,我們可以用try,catch代表錯誤對象後做出處理.
package dongmengyuan;
/**
* Created by dongmengyuan on 16-11-23.
*/
import java.util.*;
public class Average3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double sum = 0;
int count = 0;
while(true) {
try {
int number = input.nextInt();
if(number == 0) {
break;
}
sum += number;
count++;
}
catch (InputMismatchException ex) {
System.out.printf("略過非整數輸入 %s%n",input.next());
}
}
System.out.printf("平均 %.2f%n",sum/count);
}
}
執行結果爲
//執行完catch區塊之後,由於還在while循環中,所以還可以繼續下一個循環流程
try,catch總結
運行程序時,JVM會嘗試執行try區塊中的程序代碼,如果發生錯誤,執行程序會跳離錯誤發生點,然後比較catch括號中聲明的類型,是否符合被拋出的錯誤對象類型,如果是的話,就執行catch區塊中的程序代碼,執行完並不會再返回try區塊.