目录:
碎碎念:
题目:
问题描述
原因分析:
解决方案:
碎碎念:
我知道我是低代码,但是只是完成个作业,所以就随便写了,能过测试点就行,没想到有个测试点死活过不去。
题目:
设有一个整数数组 a[], a 有 10 个元素,其值依次为 0 到 9。从键盘输入整数i的值,求 a[i] 的倒数。
注意:处理各种异常。发生异常后,根据不同的异常,输出警告。
裁判测试程序样例:
java">import java.util.Scanner;
import java.util.InputMismatchException;public class Main {public static void main(String[] args) {int[] a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};/* 请在这里填写答案 */}
}
输入格式:
先输入一个整数 n,表示有 n 组数据。此后有 n 行,每行有一个整数 i。
输出格式:
正常情况下,输出 1 / a[i] 的值(整数形式)。
如果发生 InputMismatchException 异常,输出 “catch a InputMismatchException”。
如果发生 ArrayIndexOutOfBoundsException 异常,输出 “catch a ArrayIndexOutOfBoundsException”。
如果发生 ArithmeticException 异常,输出 “catch a ArithmeticException”。
问题描述
输入以下代码,发现测试点怎么都过不去......
java">Scanner scan = new Scanner (System.in);
try {int n = scan.nextInt();int num, div;for (int i = 0; i < n; i++) {try {num = scan.nextInt ();div = 1 / a[num];System.out.println(div);} catch (InputMismatchException e) {System.out.println("catch a InputMismatchException");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("catch a ArrayIndexOutOfBoundsException");} catch (ArithmeticException e) {System.out.println("catch a ArithmeticException");}}} catch (InputMismatchException e) {System.out.println("catch a InputMismatchException");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("catch a ArrayIndexOutOfBoundsException");}
scan.close();
原因分析:
当键盘输入类型与接收类型不一致,同时将语句放入 try-catch 块中时,就会卡住。
输入缓冲区里的内容未被读取出来,当我们循环再次使用 Scanner 对象输入数据时,JVM 会优先将输入缓冲区内的剩余的内容读取出来,赋值给变量。
此时,由于缓冲区内的数据仍然与变量类型不一致,导致问题重复发生。因此我们需要清空输入缓存区域,这里我们考虑让变量重新指向一个新的 Scanner 对象。
解决方案:
我们让输入类型不一致报错时,多运行一句整行的输入即可。添加内容如下:
java">scan.nextLine();
完整代码:
java">Scanner scan = new Scanner (System.in);
try {int n = scan.nextInt();int num, div;for (int i = 0; i < n; i++) {try {num = scan.nextInt ();div = 1 / a[num];System.out.println(div);} catch (InputMismatchException e) {System.out.println("catch a InputMismatchException");scan.nextLine();} catch (ArrayIndexOutOfBoundsException e) {System.out.println("catch a ArrayIndexOutOfBoundsException");} catch (ArithmeticException e) {System.out.println("catch a ArithmeticException");}}} catch (InputMismatchException e) {System.out.println("catch a InputMismatchException");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("catch a ArrayIndexOutOfBoundsException");}
scan.close();
最终程序:
java">import java.util.Scanner;
import java.util.InputMismatchException;public class Main {public static void main(String[] args) {int[] a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};Scanner scan = new Scanner (System.in);try {int n = scan.nextInt();int num, div;for (int i = 0; i < n; i++) {try {num = scan.nextInt ();div = 1 / a[num];System.out.println(div);} catch (InputMismatchException e) {System.out.println("catch a InputMismatchException");scan.nextLine();} catch (ArrayIndexOutOfBoundsException e) {System.out.println("catch a ArrayIndexOutOfBoundsException");} catch (ArithmeticException e) {System.out.println("catch a ArithmeticException");}}} catch (InputMismatchException e) {System.out.println("catch a InputMismatchException");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("catch a ArrayIndexOutOfBoundsException");}scan.close();}
}
这样我们就解决了我们所遇到的问题,顺利通过测试点。