try-catch問題
在異常問題中,需要用到try-catch來獲取異常,並對他進行處理。
但是把try-catch放到循環裏,容易出現死循環。例題如下:
題目:使用異常機制處理異常輸入
1. 輸入n,創建大小爲n的int數組。
2. 輸入n個整數,放入數組。輸入時,有可能輸入的是非整型字符串,這時候需要輸出異常信息,然後重新輸入。
3. 使用Arrays.toString輸出數組中的內容。
輸入樣式:
5
1
2
a
b
4
5
3
輸出樣式
java.lang.NumberFormatException: For input string: "a"
java.lang.NumberFormatException: For input string: "b"
[1, 2, 4, 5, 3]
// 代碼如下
package com.zjr1;
import java.util.Arrays;
import java.util.Scanner;
public class dome3 {
public static void main(String args[]){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
for(int i = 0;i<n;i++){
try{
a[i] = in.nextInt();
}
catch(Exception e){
System.out.println("java.lang.NumberFormatException: For input string");
i--;
}
}
System.out.println(Arrays.toString(a));
in.close();
}
}
但是,你會發現輸出是死循環,會一直執行catch中的輸出語句
所以當輸入異常後,catch到exception,開始下一次循環,但這時數據緩衝區內你上次輸入的異常還在,並沒有清除,這時繼續解析異常,就又catch到exception,還是錯誤,於是這個過程就一直重複下去了。
解決方法(2種):
- 在catch()語句 中加上in.next();
- 將in的定義寫在try語句內。
正確的程序:
package lalala;
import java.util.Arrays;
import java.util.Scanner;
public class exception {
public static void main(String args[]){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
String str = "";
for(int i = 0;i<n;i++){
String s = in.next();
try{
int t = Integer.parseInt(s);
a[i] = t;
}
catch(Exception e){
str = str + s;
i--;
}
}
for(int i=0;i<str.length();i++){
System.out.println("java.lang.NumberFormatException: For input string: \""+ str.charAt(i) +"\"");
}
System.out.println(Arrays.toString(a));
in.close();
}
}
運行結果如下: