
嘻道奇闻
- 文章199742
- 阅读14625734
避免Java输入报错:InputMismatchException异常处理方案,彻底解决数据类型冲突,实战经验分享
社会2025-05-19 14:32:02
哎!你是不是刚写完Scanner输入代码,一运行就看见满屏红色的InputMismatchException?别急着砸键盘,今天咱们就掰开了揉碎了说说这个磨人的小妖精。??我敢打赌,看完这篇你至少能少踩80%的输入坑!??
这异常到底从哪蹦出来的?
(拍桌子)先看个经典翻车现场:
java复制Scanner scanner = new Scanner(System.in); System.out.print("请输入您的年薪:"); double salary = scanner.nextDouble(); // 用户输入"二十万"当场爆炸
??三大作死姿势排行榜??:
- 输入文字却用nextInt()读取(稳居榜首)
- 数字里带特殊符号(比如12,345的逗号)
- 用错小数点格式(某些国家用逗号表示小数)
??血泪教训??:上周我徒弟就因为没处理用户输入的空格,让整个系统挂了2小时。记住啊朋友们,??用户永远不按套路出牌??!
五招教你驯服InputMismatchException
??第一式:hasNextXXX()预判??
java复制System.out.print("输入年龄:"); while(!scanner.hasNextInt()) { System.out.println("别闹!请输入数字"); scanner.next(); // 把错误输入吞掉 } int age = scanner.nextInt();
??优点??:提前拦截非法输入,程序不会崩溃
??缺点??:要写循环比较麻烦
??第二式:try-catch兜底??
java复制try { System.out.print("输入体重(kg):"); double weight = scanner.nextDouble(); } catch (InputMismatchException e) { System.out.println("您输入的不是数字!"); scanner.nextLine(); // 清空缓冲区 }
??适合场景??:已经发生的异常补救
??注意??:一定要清空缓冲区,否则死循环!
??第三式:统一用nextLine()接收??
(竖大拇指)这是我压箱底的绝活!
java复制System.out.print("输入手机号:"); String input = scanner.nextLine(); if(!input.matches("\\d{11}")) { System.out.println("号码格式不对啊老铁!"); return; } long phone = Long.parseLong(input);
??好处??:完全掌控输入内容,避免Scanner自动解析的坑
??第四式:Locale大法??
对付国际化的数字格式有奇效:
java复制scanner.useLocale(Locale.US); // 强制用小数点格式 System.out.print("输入身高(米):"); double height = scanner.nextDouble();
??第五式:自定义输入工具类??
(敲黑板)高手都这么干!送你个现成的:
java复制public class SafeInput { public static int getInt(Scanner sc, String prompt) { while(true) { System.out.print(prompt); if(sc.hasNextInt()) return sc.nextInt(); System.out.println("【警告】需要整数输入!"); sc.nextLine(); } } // 同理实现getDouble、getLong等方法 }
输入方案性能对比表
选方案不能闭眼瞎选,数据说话最靠谱:
方案 | 安全性 | 代码量 | 执行效率 | 学习成本 |
---|---|---|---|---|
直接nextXXX() | ★ | ☆☆☆☆ | ☆☆☆☆ | ☆ |
hasNextXXX()验证 | ☆☆☆☆ | ☆☆ | ☆☆☆ | ☆☆ |
try-catch捕获 | ☆☆☆ | ☆☆☆ | ☆☆ | ☆☆☆ |
统一nextLine()转换 | ☆☆☆☆ | ☆ | ☆☆☆☆ | ☆☆☆☆ |
搞了这么多年Java,我发现个真理:??输入验证就像戴口罩——麻烦但保命??。见过最离谱的案例是用户输入"一千"导致ATM机死机,结果银行赔了双倍金额。所以啊,别嫌防御性编程费事,真出了事就不是多写几行代码的问题了。记住,能把异常扼杀在摇篮里的程序员,才是真正的扫地僧!