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();
	}
}

运行结果如下:
在这里插入图片描述

发布了24 篇原创文章 · 获赞 26 · 访问量 2716

猜你喜欢

转载自blog.csdn.net/apple_2021/article/details/103213293