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

