Java 异常处理

devtools/2024/11/29 7:55:38/

目录:

碎碎念:

题目:

问题描述

原因分析:

解决方案:


碎碎念:

        我知道我是低代码,但是只是完成个作业,所以就随便写了,能过测试点就行,没想到有个测试点死活过不去。

题目:

        设有一个整数数组 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();}
}

        这样我们就解决了我们所遇到的问题,顺利通过测试点。


http://www.ppmy.cn/devtools/137868.html

相关文章

【优选算法】位运算

目录 常见位运算总结1、基础位运算2、给一个数n&#xff0c;确定它的二进制位的第x位上是0还是13、将一个数n的二进制位的第x位改成14、将一个数n的二进制位的第x位改成05、位图的思想6、提取一个数n的二进制位中最右侧的17、将一个数n的二进制位中最右侧的1变为08、位运算的优…

【C++】7000字介绍map容器和set容器的功能和使用

目录 一、关联式容器和序列式容器 二、键值对,> 三、树形结构的关联式容器 四、set容器&#xff08;key模型&#xff09; 1、文档官网 2、功能介绍&#xff1a; 3、注意事项&#xff1a; 4、基本使用&#xff0c;更多接口可查看官网&#xff1a; &#xff08;1&…

【代码随想录|贪心算法02】

122.买股票的最佳时机 题目链接https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii 好巧妙的一道题啊&#xff0c;做之前完全不会想到这种解法。 局部最优&#xff1a;收集每天正利润 全局最优&#xff1a;求得最大利润 这道题只让你返回最大的利润和&…

大数据 MapReduce基础实战

一、关于此次实践 1、实战简介 MapReduce是Hadoop的核心功能之一&#xff0c;掌握它对学习Hadoop至关重要。Hadoop Map/Reduce是一个使用简易的软件框架&#xff0c;基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上&#xff0c;并以一种可靠容错的方式并行…

定长子串中元音的最大数目

力扣链接:1456. 定长子串中元音的最大数目 - 力扣&#xff08;LeetCode&#xff09; 给你字符串 s 和整数 k 。 请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。 英文中的 元音字母 为&#xff08;a, e, i, o, u&#xff09;。 示例1: 输入&#xf…

分布式MQTT代理中使用布隆过滤器管理通配符主题

论文标题&#xff1a;Wildcard Topic Management using Bloom Filter in Distributed MQTT Brokers 中文标题&#xff1a;分布式MQTT代理中使用布隆过滤器管理通配符主题 作者信息&#xff1a; Ryohei Banno&#xff0c;Hitotsubashi University, Graduate School of Social…

计算机网络的发展

目录 起源与早期发展 ARPANET与TCP/IP协议的诞生 互联网的诞生与普及 高速互联网与无线网络的兴起 移动互联网与云计算的崛起 物联网、区块链与自动驾驶技术的兴起 起源与早期发展 计算机网络的雏形最早可以追溯到20世纪60年代&#xff0c;主要是为了共享大型计算资源。当…

力扣2978. 对称坐标

一、数据 2978. 对称坐标 表&#xff1a; Coordinates ------------------- | Column Name | Type | ------------------- | X | int | | Y | int | ------------------- 每一行包括 X 和 Y&#xff0c;都是整数。表格可能包含重复值。如果两个坐标 (…