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
相关产品推荐
相关产品推荐

