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

为何try-catch无法捕获InputMismatchException异常?

为什么你的try-catch块没捕获到InputMismatchException?

这个问题的核心其实是异常发生的位置不在你try-catch包裹的代码范围内,咱们一步步拆解清楚:

  • 首先,当你输入非数字"hesdd"时,异常是在执行x.nextInt()的瞬间抛出的——Scanner的nextInt()方法要求输入必须是合法整数,一旦不符合格式就会直接抛出InputMismatchException,这时候你的代码还没走到p.setFloor(f)这一步呢!
  • 再看你的setFloor方法:里面的try块只包裹了this.floor = floor这一行代码。而给int类型变量赋值整数(能走到这一步的话,floor已经是nextInt()返回的合法整数了),这个操作本身根本不会抛出InputMismatchException,所以你的catch块完全没机会触发这个异常。

那怎么改才能正确捕获异常呢?有两种常见思路:

思路1:把可能抛异常的输入操作放进try块

直接将nextInt()的调用包裹在try-catch里,这样异常一发生就能被捕获:

try {
    System.out.println("Enter floor: "); 
    int f = x.nextInt(); 
    p.setFloor(f);
} catch (InputMismatchException e) {
    System.out.println("Enter only digits");
}

思路2:在setFloor方法内部处理输入解析

如果想把异常逻辑封装到setFloor里,那得先把输入内容以字符串形式传入,在方法内部做解析和异常处理(避免提前调用nextInt()触发异常):

// 调用端代码
System.out.println("Enter floor: "); 
String input = x.next();
p.setFloor(input);

// 修改后的setFloor方法
public void setFloor(String input){
    try{
        this.floor = Integer.parseInt(input);
    } catch (NumberFormatException e){
        System.out.println("Enter only digits");
    }
}

这样就能正确捕获输入非数字的异常啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:56:09