解决Scanner异常导致程序奔溃直接结束

本文探讨了在Java中如何处理程序运行时发生的异常,并通过递归调用确保程序的稳定运行。具体分析了一个包含无限循环、菜单显示、用户输入处理及异常捕获的示例代码。
  public static void fun(Scanner scanner) {
        try {
            while (true) {
                switch (menuDisplay(scanner)) {
                    .
                    .
                    .
              
                }
                System.out.println("请输入功能选项");
                System.out.println("是否继续?y/n");
                if ("n".equals(scanner.next())) {
                    System.exit(0);
                }
            }
        } catch (Exception e) {
            System.out.println("发生异常");
            //递归调用 重新new Scanner  原有的线程发生异常无法继续使用
            fun(new Scanner(System.in));
        }
    }

在这里插入图片描述

1. 异常处理机制的应用 —— 简易计算器异常处理 1.1 样例 问题描述 编写简易计算器程序,实现两个整数的除法运算,处理以下异常场景: 1.除数为 0:触发ArithmeticException; 2.输入非整数:触发InputMismatchException; 要求:用try-catch捕获异常并给出友好提示,用finally关闭Scanner资源,确保程序不崩溃。 输入输出示例 正常输入: 请输入第一个整数:10 请输入第二个整数:2 计算结果:10 / 2 = 5 资源已释放(Scanner关闭) 异常输入(除数为 0): 请输入第一个整数:8 请输入第二个整数:0 异常提示:除数不能为0,请重新输入有效数字! 资源已释放(Scanner关闭) 异常输入(非整数): 请输入第一个整数:abc 异常提示:输入格式错误!请输入整数类型。 资源已释放(Scanner关闭) 样例代码 import java.util.InputMismatchException; import java.util.Scanner; public class CalculatorExceptionDemo { public static void main(String[] args) { Scanner sc = null; // 声明Scanner,便于finally关闭 try { // 1. 获取用户输入(可能触发InputMismatchException) sc = new Scanner(System.in); System.out.print("请输入第一个整数:"); int num1 = sc.nextInt(); System.out.print("请输入第二个整数:"); int num2 = sc.nextInt(); // 2. 除法运算(可能触发ArithmeticException) int result = num1 / num2; System.out.printf("计算结果:%d / %d = %d\n", num1, num2, result); } catch (ArithmeticException e) { // 捕获“除数为0”异常 System.out.println("异常提示:除数不能为0,请重新输入有效数字!"); // 可选:打印异常堆栈信息(调试用) // e.printStackTrace(); } catch (InputMismatchException e) { // 捕获“输入非整数”异常 System.out.println("异常提示:输入格式错误!请输入整数类型。"); } finally { // 3. 无论是否异常,均关闭Scanner(资源释放) if (sc != null) { // 避免sc为null时调用close()报错 sc.close(); System.out.println("资源已释放(Scanner关闭)"); } } } } 1.2 实验题目 升级简易计算器,支持 “整数数组求和” 功能,处理以下异常场景: 1.数组长度为负:触发IllegalArgumentException(通过throw主动抛出); 2.数组索引越界:触发ArrayIndexOutOfBoundsException; 3.输入非整数:触发InputMismatchException; 要求: 用try-catch捕获所有异常,给出对应提示; 用throws在方法声明处声明可能抛出的异常; 用finally确保Scanner资源关闭; 程序执行完毕后打印 “计算器程序结束”。 测试用例 测试场景 1:正常输入(数组长度 2,元素 3、5) 请输入数组长度(正整数):2 请输入2个整数(空格分隔):3 5 数组元素总和:8 资源已释放(Scanner关闭) 计算器程序结束 测试场景 2:数组长度为负 请输入数组长度(正整数):-3 异常提示:数组长度不能为负! 资源已释放(Scanner关闭) 计算器程序结束 测试场景 3:输入非整数 请输入数组长度(正整数):2 请输入2个整数(空格分隔):4 abc 异常提示:输入格式错误!请输入整数类型。 资源已释放(Scanner关闭) 计算器程序结束 测试场景 4:数组索引越界(数组长度 2,循环条件 i<=2) 请输入数组长度(正整数):1 请输入2个整数(空格分隔):1 2 异常提示:数组索引越界,请检查数组操作逻辑! 资源已释放(Scanner关闭) 计算器程序结束
最新发布
11-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值