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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:36:27