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

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);
    }
}

关键修复说明

  1. 移除手动抛出异常:让nextDouble()自己处理输入校验,只有遇到非数字时才进入catch块。
  2. 清空输入缓冲区:在catch块里调用scnr.next(),把缓冲区里的错误字符串(比如"thirty")消费掉,这样下次调用nextDouble()才能读取新的输入。
  3. 完善循环逻辑:当输入负数时,主动提示并保持循环;当捕获到异常时,重置wallHeight为负数,确保循环继续执行,直到用户输入合法的正数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:02:36