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();
}
}
运行结果如下: