You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java整数输入程序异常排查:捕获块问题与循环终止异常

问题分析与解决方案

嘿,我来帮你拆解下代码里的两个核心问题:

1. 为什么IOException捕获块提示无法到达?

Scanner的nextInt()方法根本不会抛出IOException!这个异常是用来处理文件读写、网络IO这类底层IO错误的,而当你输入非整数时,Scanner抛出的是InputMismatchException(属于运行时异常的子类)。编译器能识别到try块里不会出现IOException,所以才会提示“无法到达的捕获块”。

2. 为什么换成catch(Exception e)后程序一次输入就终止?

问题出在你把in.close()放在了while循环内部!只要第一次循环执行到这行代码,Scanner就会被关闭,后续再尝试读取输入就会直接失败,程序自然就退出了——不管你输入的是整数还是非整数。


修正后的完整代码

import java.util.Scanner;
import java.util.InputMismatchException;

public class Question2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        boolean active = true;
        String num_string_positive = "";
        String num_string_negative = "";
        int my_int;

        while (active) {
            try {
                System.out.print("请输入一个整数:");
                my_int = in.nextInt();
                // 按你的需求处理正负整数
                if (my_int > 0) {
                    num_string_positive += my_int + " ";
                } else if (my_int < 0) {
                    num_string_negative += my_int + " ";
                }
                // 输出当前记录方便验证
                System.out.println("已记录的正整数:" + num_string_positive);
                System.out.println("已记录的负整数:" + num_string_negative);
            } catch (InputMismatchException e) {
                System.out.println("输入的不是整数,程序即将终止");
                active = false;
                // 必须清理缓冲区的残留输入,否则会触发无限循环
                in.nextLine();
            }
        }
        // 循环结束后再关闭Scanner
        in.close();
    }
}

关键修正点说明

  • 捕获正确的异常:用InputMismatchException替代IOException,精准匹配输入非整数的场景
  • 延迟关闭Scanner:把in.close()移到循环外部,确保程序能持续接收输入直到触发终止条件
  • 清理输入缓冲区:捕获异常后调用in.nextLine(),清除缓冲区里的非整数内容,避免Scanner反复读取同一个错误输入导致死循环
  • 补充业务逻辑:完善了你最初定义的正负字符串记录功能,让程序更符合你的设计目标

内容的提问来源于stack exchange,提问作者Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:52:52