java之異常處理try-catch的死循環問題

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種):

  1. 在catch()語句 中加上in.next();
  2. 將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();
	}
}

運行結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章