【Java】異常處理練習題所遇到的錯誤
阿新 • • 發佈:2019-02-02
異常處理練習題所遇到的錯誤
問題: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
我的思路是這樣的:
- 首先,這個程式應該是應該死迴圈
while(true){...}
- 輸入和輸出都寫在
try
塊裡 - 如果兩個整數都輸入正確則輸出結果,
break
跳出迴圈 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語句塊的內容迴圈輸出,思考了一下,憑藉之前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;
}
}
}
}