關於處理try-catch迴圈一次異常,次次異常的一個例子
阿新 • • 發佈:2019-01-11
學習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();//將錯誤字元移出輸入管道 } } } }
輸出執行結果: