1. 程式人生 > >關於處理try-catch迴圈一次異常,次次異常的一個例子

關於處理try-catch迴圈一次異常,次次異常的一個例子

學習Java過程中,遇到這麼一道題:

從鍵盤輸入一個整數,判斷該數值是否大於當前月份。


由於從鍵盤輸入的不一定是整數,我想用一個try-catch語句處理異常,並重新執行輸入步驟。程式碼如下:

import java.util.Calendar;
import java.util.Scanner;

public class TestScanner {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		System.out.println("請輸入一個整數:");
		
		Calendar c = Calendar.getInstance();
		
		//應用迴圈,當控制檯輸入的數不是整數時,重新輸入一個數,重新判斷
		while (true) {
			try {
				int i = s.nextInt();
				if (i > c.get(Calendar.MONTH) + 1) {
					System.out.println("該數值大於當前月份");
				} else if (i < c.get(Calendar.MONTH) + 1) {
					System.out.println("該數值小於當前月份");
				}else {
					System.out.println("該數值等於當前月份");
				}
				break;
			} catch (Exception e) {
				System.out.println("輸入型別錯誤,請重新輸入一個整數:");				
			} 
		}
	}
}


程式執行後,我輸入字元 k ,結果程式迴圈輸出:

輸入型別錯誤,請重新輸入一個整數

程式一直執行catch語句。

原因分析:

當錯誤字元 k 進入迴圈時,k 不是整數,產生異常,執行 catch 語句。但輸入錯誤的字元由於發生異常,並沒有從輸入管道中提取出來,進而導致進行迴圈時依然產生異常。

解決的方法:

鍵盤輸入的都可看成是字元型,在 Catch 語句中新增一個 String 型別變數 clear ,將錯誤字元讀出,即可。


解決後代碼為:


import java.util.Calendar;
import java.util.Scanner;

public class TestScanner {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		System.out.println("請輸入一個整數:");
		
		Calendar c = Calendar.getInstance();
		
		//應用迴圈,當控制檯輸入的數不是整數時,重新輸入一個數,重新判斷
		while (true) {
			try {
				int i = s.nextInt();
				if (i > c.get(Calendar.MONTH) + 1) {
					System.out.println("該數值大於當前月份");
				} else if (i < c.get(Calendar.MONTH) + 1) {
					System.out.println("該數值小於當前月份");
				}else {
					System.out.println("該數值等於當前月份");
				}
				break;
			} catch (Exception e) {
				System.out.println("輸入型別錯誤,請重新輸入一個整數:");
				@SuppressWarnings("unused")
				String clear = s.next();//將錯誤字元移出輸入管道
			} 
		}
	}
}


輸出執行結果: