Java Scanner输入不匹配异常求助及代码修复
嘿,我来帮你搞定这个问题!你遇到的InputMismatchException是因为当用户输入的不是整数时,Scanner.nextInt()没办法解析,直接抛出异常了。咱们一步步来修复,顺便把代码里的其他小问题也一起解决掉。
1. 修复Main.java中的输入异常问题
原来的代码里,没有对用户输入的整数做校验,一旦输入非整数就会炸。而且catch块里直接递归调用start(),搞不好会触发栈溢出。咱们改成先判断输入是否是整数,再处理:
import java.util.Scanner; public class Main { Save option = new Save(); public static void main(String[] args) { Main main = new Main(); main.start(); } public void start() { Scanner scanner = new Scanner(System.in); System.out.println("1. Add random words to file"); // 先校验输入是否为整数,不是就提示并清空缓冲区 while (!scanner.hasNextInt()) { System.out.println("请输入有效的数字(1)!"); scanner.nextLine(); // 清空无效输入的残留内容 } int result = scanner.nextInt(); scanner.nextLine(); // 读取掉整数后面的换行符,避免影响后续的nextLine() if (result == 1) { try { System.out.println("Type some words"); String safeWordsString = scanner.nextLine(); option.saveWords(safeWordsString); // 修正方法名拼写,更符合Java命名规范 } catch (Exception e) { System.out.println("输入过程出错啦:" + e.getMessage()); start(); // 保留重试逻辑,建议后续可以加重试次数限制避免栈溢出 } } else { System.out.println("请输入选项1哦!"); start(); } } }
关键修复点:
- 用
scanner.hasNextInt()提前校验输入,从根源避免InputMismatchException - 用
scanner.nextLine()清空无效输入的缓冲区,防止死循环 - 增加了无效选项的提示逻辑,提升用户体验
- 修正方法名拼写(
safeWords→saveWords),符合Java驼峰命名规范
2. 修复Save.java中的文件操作问题
原来的Save类有几个坑:用PrintWriter直接打开文件会覆盖原有内容(不是追加),文件不存在时会抛异常,还有资源关闭不规范,拼写错误(nextline()→nextLine())。咱们改成这样:
import java.io.*; import java.util.Date; import java.util.Scanner; public class Save { // 修正方法名拼写为saveWords public void saveWords(String saveText) { File original = new File("test.txt"); // 先判断文件是否存在,不存在则创建 if (!original.exists()) { try { original.createNewFile(); } catch (IOException e) { System.out.println("创建文件失败:" + e.getMessage()); return; } } try ( // 用try-with-resources自动关闭流,避免资源泄漏 // 读取原有文件内容(如果需要保留的话,追加模式下其实可以省略这一步) Scanner scanner = new Scanner(original); // 开启追加模式的文件写入(第二个参数true表示追加) PrintWriter pw = new PrintWriter(new FileWriter(original, true)) ) { // 如果需要保留原有内容再追加,这里可以先写入原有内容,否则直接写新内容即可 pw.println(new Date() + " " + saveText); System.out.println("内容已成功追加到文件!"); } catch (IOException e) { System.out.println("文件操作出错:" + e.getMessage()); } } }
关键修复点:
- 改用
FileWriter的追加模式(第二个参数true),彻底解决文件被覆盖的问题 - 增加文件不存在时的自动创建逻辑,避免抛出文件未找到异常
- 用
try-with-resources自动关闭流,规范资源管理,防止内存泄漏 - 简化了文件操作逻辑(原代码读取所有内容再写入是多余的,追加模式直接写新内容即可)
- 修正了拼写错误,让代码更规范
总结一下修复的核心点
- 输入校验:提前判断输入是否为整数,彻底解决
InputMismatchException - 错误处理:清空无效输入缓冲区,避免死循环,增加友好提示
- 文件操作:改用追加模式,处理文件不存在的情况,规范资源管理
- 代码规范:修正拼写错误,让方法名更符合Java命名规范
内容的提问来源于stack exchange,提问作者InterstingJavaLearner
相关产品推荐
相关产品推荐

