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

Java Try Catch未按预期触发InputMismatchException异常问题

问题原因与修复方案

核心问题说明

  1. InputMismatchException无法触发的根本原因:
    你调用的是Scanner.next()方法,该方法会将任意非空白输入统一以String类型返回,无论输入的是字母、数字还是特殊符号,都不会触发类型不匹配异常。只有调用nextInt()、nextBoolean()这类指定返回数据类型的Scanner方法时,输入与预期类型不符才会抛出InputMismatchException。
  2. if-else分支逻辑错误:
    你最后一个分支的判断条件!answer.equals(choices)完全无效:choices是字符串数组,单个字符串和数组调用equals()方法永远返回false。前面三个if已经覆盖了输入为a/b/c的合法场景,只要输入不属于这三个值,不管是数字还是其他非法字符,都会直接抛出InvalidLetterException,这就是你输入整数也触发自定义异常的直接原因。

修复方案

如果你需要区分「输入数字」和「输入其他非法字符」的异常逻辑,可以先对拿到的输入字符串做数字校验,匹配到数字直接抛出InputMismatchException,再校验是否属于合法选项a/b/c,不属于的话抛出InvalidLetterException。
修复后的代码如下:

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

// 此处为自定义异常类示例,可保留你原有定义的InvalidLetterException
class InvalidLetterException extends Exception {
    @Override
    public String getMessage() {
        return "输入的选项非法,请输入a/b/c";
    }
}

public class Quiz {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String questions[] = {"天空是什么颜色?", "1 + 1等于多少?",
                "菲律宾的首都是哪里?", "菲律宾现任总统是谁?",
                "日本的首都是哪里?", "2 + 3等于多少?",
                "9 + 1等于多少?", "美国的首都是哪里?",
                "10 + 10等于多少?", "人类一只手有多少根手指?"};
        String choices[] = {"a","b","c"};
        int x = 0;
        int y = 0;

        try {
            while(x<=9) {
                System.out.println("第" + (x+1) + "题:" + questions[x]);
                String answer = scan.next();
                // 新增数字校验逻辑,匹配到纯数字就抛出InputMismatchException
                if(answer.matches("\\d+")) {
                    throw new InputMismatchException();
                }
                x++;
                // 合并冗余的合法选项判断逻辑
                if(answer.equals(choices[0]) || answer.equals(choices[1]) || answer.equals(choices[2])) {
                    scan.nextLine(); // 吞掉输入后的换行符
                } else {
                    // 非数字也不属于合法选项,抛自定义异常
                    throw new InvalidLetterException();
                }
            }
        } catch(InvalidLetterException e) {
            System.out.println(e.getMessage());
            System.out.println(); // 空行间隔
            System.out.println("你可以再试一次");
            System.out.println(); // 空行间隔
            do {
                System.out.println("第" + (y+1) + "题:" + questions[y]);
                scan.next();
                y++;
            }while(y<=9);
        } catch (InputMismatchException i) {
            System.out.println("请不要输入数字");
        } finally {
            scan.close();
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:24:00