Java程序捕获InputMismatchException后仍报错且无法续行的问题排查
问题分析与修复方案
咱们来一步步拆解你代码里的问题,以及怎么修复:
核心错误点
- 画蛇添足的手动抛出异常:你在
try块里主动调用throw new InputMismatchException(),这完全没必要!scnr.nextDouble()本身在遇到非数字输入时就会自动抛出这个异常,你手动抛出会导致哪怕输入正确的double值,也会强制进入catch块,直接打乱了正常流程。 - 未清理输入缓冲区的致命错误:当输入错误内容(比如"thirty")时,这个错误的字符串还留在Scanner的输入缓冲区里。你在catch块里直接调用
scnr.nextDouble(),还是会读取到这个错误内容,自然再次抛出异常导致程序崩溃。 - 循环逻辑不完整:你的do-while循环只检查了
wallHeight <= 0,但异常处理后的重新输入流程没有和循环逻辑结合起来,导致错误输入的处理完全失效。
修复后的代码示例
import java.util.Scanner; import java.util.InputMismatchException; public class Paint1 { public static void main(String[] args) { Scanner scnr = new Scanner(System.in); double wallHeight = 0.0; double wallWidth = 0.0; double wallArea = 0.0; double gallonsPaintNeeded = 0.0; final double squareFeetPerGallons = 350.0; // 处理墙高输入的逻辑 do { System.out.println("Enter wall height (feet): "); try { wallHeight = scnr.nextDouble(); // 输入合法但为负数的情况,提示用户 if (wallHeight <= 0) { System.out.println("Height must be a positive number. Please try again."); } } catch (InputMismatchException exc) { System.out.println("Invalid input. Please enter a numeric value."); // 关键:清空缓冲区里的错误输入,避免死循环 scnr.next(); // 重置wallHeight为负数,确保循环继续 wallHeight = -1; } } while (wallHeight <= 0); // 同理可以复制这个逻辑处理墙宽输入 do { System.out.println("Enter wall width (feet): "); try { wallWidth = scnr.nextDouble(); if (wallWidth <= 0) { System.out.println("Width must be a positive number. Please try again."); } } catch (InputMismatchException exc) { System.out.println("Invalid input. Please enter a numeric value."); scnr.next(); wallWidth = -1; } } while (wallWidth <= 0); // 计算面积和所需油漆量 wallArea = wallHeight * wallWidth; gallonsPaintNeeded = wallArea / squareFeetPerGallons; System.out.printf("Wall area: %.2f square feet%n", wallArea); System.out.printf("Gallons needed: %.2f%n", gallonsPaintNeeded); } }
关键修复说明
- 移除手动抛出异常:让
nextDouble()自己处理输入校验,只有遇到非数字时才进入catch块。 - 清空输入缓冲区:在catch块里调用
scnr.next(),把缓冲区里的错误字符串(比如"thirty")消费掉,这样下次调用nextDouble()才能读取新的输入。 - 完善循环逻辑:当输入负数时,主动提示并保持循环;当捕获到异常时,重置
wallHeight为负数,确保循环继续执行,直到用户输入合法的正数。
内容的提问来源于stack exchange,提问作者Bass3922
相关产品推荐
相关产品推荐

