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

读取浮点型数组格式文本文件时触发InputMismatchError的问题求助

解决Java读取浮点数组文本文件时的InputMismatchError问题

嘿,我来帮你分析下代码里的问题,以及如何修复这个读取浮点数组文件的逻辑:

问题根源

你的代码触发InputMismatchError主要有两个原因:

  • 格式与Scanner默认分隔符不兼容:你的文件内容是带方括号[]和逗号,的数组格式,但Scanner默认只会以空白字符作为分隔符。当它读到[、,、]这些非浮点数字符时,自然无法解析成float类型,直接抛出输入不匹配异常。
  • 重复调用nextFloat()导致逻辑混乱:循环里你连续调用了两次scanner.nextFloat(),这意味着每次循环会跳过一个元素(第一次读一个值,第二次直接读下一个),不仅会导致数据处理不全,还会在最后一次循环时因为没有剩余元素而抛出异常。

修复方案

这里提供两种可行的修复方式,你可以根据需求选择:

方法一:修改Scanner分隔符,适配数组格式

通过自定义分隔符,让Scanner忽略方括号、逗号和空白字符,直接提取浮点数:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FloatArrayReader {
    public static void main(String[] args) throws FileNotFoundException {
        File txt = new File("C:/Users/User1/Documents/rboukarf_hard.txt");
        Scanner scanner = new Scanner(txt);
        
        // 设置分隔符:匹配方括号、逗号、任意空白字符,只提取浮点数部分
        scanner.useDelimiter("[\\[\\],\\s]+");
        
        try {
            // 用StringBuilder代替字符串拼接,效率更高
            StringBuilder resultBuilder = new StringBuilder(); 
            while (scanner.hasNextFloat()) {
                float currentNum = scanner.nextFloat(); // 只读取一次当前浮点数
                System.out.println(currentNum);
                
                // 按规则拼接结果
                if (currentNum < 1) {
                    resultBuilder.append("0 ");
                } else {
                    resultBuilder.append("2 ");
                }
            }
            
            // 输出最终处理结果
            System.out.println("\n处理后的结果:");
            System.out.println(resultBuilder.toString());
        } catch (Exception e) {
            System.out.println("Exception thrown: " + e);
        } finally {
            scanner.close(); // 记得关闭Scanner释放资源
        }
    }
}

方法二:读取整个文件内容后解析(更直观)

先读取整个文件的字符串内容,手动去除方括号、分割元素后再解析:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

public class FloatArrayReader {
    public static void main(String[] args) throws IOException {
        File txt = new File("C:/Users/User1/Documents/rboukarf_hard.txt");
        // 读取整个文件的字符串内容
        String fileContent = new String(Files.readAllBytes(txt.toPath()));
        
        // 去掉方括号,按逗号分割成单个数字字符串
        String[] floatStringArray = fileContent.replaceAll("[\\[\\]]", "").split(",");
        StringBuilder resultBuilder = new StringBuilder();
        
        for (String numStr : floatStringArray) {
            // 去除字符串前后的空白,解析为浮点数
            float currentNum = Float.parseFloat(numStr.trim());
            System.out.println(currentNum);
            
            // 按规则拼接结果
            if (currentNum < 1) {
                resultBuilder.append("0 ");
            } else {
                resultBuilder.append("2 ");
            }
        }
        
        // 输出最终处理结果
        System.out.println("\n处理后的结果:");
        System.out.println(resultBuilder.toString());
    }
}

关键改进说明

  • 两种方法都确保每个浮点数只被读取/解析一次,避免了原代码中重复读取导致的元素丢失和异常。
  • 使用StringBuilder代替直接字符串拼接,在处理大量元素时性能会好很多。
  • 方法一中添加了finally块关闭Scanner,符合Java资源管理的最佳实践。

内容的提问来源于stack exchange,提问作者anonbeaker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:04:05