1. 程式人生 > >【Java】異常處理練習題所遇到的錯誤

【Java】異常處理練習題所遇到的錯誤

異常處理練習題所遇到的錯誤

問題:try catch 在一個包含輸入的迴圈裡,catch語句塊無限迴圈執行。

一切源於這道題

數字格式異常

編寫一個程式,提示使用者讀取兩個整數,然後顯示他們的和。程式應該在輸入不正確時提示使用者再次輸入數字。

輸入格式:

i 9 (第1次輸入) 
l 8 (第2次輸入) 
5 6 (第3次輸入)

輸出格式:

Incorrect input and re-enter two integers: (第1次輸出提示) 
Incorrect input and re-enter two integers: (第2次輸出提示) 
Sum is 11 (輸出結果)

輸入樣例:

i 9
l 8
5 6

輸出樣例:

Incorrect input and re-enter two integers:
Incorrect input and re-enter two integers:
Sum is 11

我的思路是這樣的:

  1. 首先,這個程式應該是應該死迴圈 while(true){...}
  2. 輸入和輸出都寫在try塊裡
  3. 如果兩個整數都輸入正確則輸出結果,break跳出迴圈
  4. catch塊裡輸出錯誤提示,然後continue讓程式繼續執行

於是有了下面的程式:

import java.util.Scanner;
import
java.io.IOException; import java.text.DecimalFormat; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); int a,b; while(true){ try{ a=in.nextInt(); b=in.nextInt(); System.out.println("Sum is "
+(a+b)); break; }catch(java.util.InputMismatchException e){ System.out.println("Incorrect input and re-enter two integers:"); continue; } } } }

但是程式並沒有像預想的一樣正常執行,執行結果如下:

catch語句塊迴圈執行

catch語句塊的內容迴圈輸出,思考了一下,憑藉之前C語言程式設計的經驗,應該是輸入流中的內容沒有被取走,從而導致迴圈獲取,迴圈拋異常,catch塊迴圈執行。

解決辦法:

JAVA中沒有C語言中的 fflush() 方法,但是依然很容易解決,在上面的程式中,多加一行 in.nextLine() 就可以達到效果,使程式正常執行。

正常執行

最終的程式碼:

import java.util.Scanner;
import java.io.IOException;
import java.text.DecimalFormat;

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int a,b;
        while(true){
            try{
                a=in.nextInt();
                b=in.nextInt();
                System.out.println("Sum is "+(a+b));
                break;
            }catch(java.util.InputMismatchException e){
                System.out.println("Incorrect input and re-enter two integers:");
                in.nextLine();
                continue;
            }

        }
    }
}