Java Try Catch未按预期触发InputMismatchException异常问题
问题原因与修复方案
核心问题说明
InputMismatchException无法触发的根本原因:
你调用的是Scanner.next()方法,该方法会将任意非空白输入统一以String类型返回,无论输入的是字母、数字还是特殊符号,都不会触发类型不匹配异常。只有调用nextInt()、nextBoolean()这类指定返回数据类型的Scanner方法时,输入与预期类型不符才会抛出InputMismatchException。- 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
相关产品推荐
相关产品推荐

