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

Java读取文件求最大最小数异常,请求排查解决

问题排查与修复指南

咱们一步一步来拆解你遇到的问题:

1. 最直接的原因:Scanner被提前耗尽了

你代码里第一个while (sc.hasNextLine())循环把整个文件的内容都读取并打印出来了,这时候Scanner的指针已经走到了文件末尾,后面的while(sc.hasNextDouble())循环根本不会执行——因为已经没有数据可读了!所以你的largest和smallest变量一直保持着初始值Double.MIN_VALUE和Double.MAX_VALUE,这就是输出不符合预期的核心问题。

解决办法:把这个测试用的打印循环删掉,或者如果需要保留打印,就重新创建一个Scanner对象来处理后续的数值解析(不过直接去掉最省事)。

2. 隐藏的坑:数字格式不兼容

就算你解决了Scanner的问题,接下来还是会遇到报错——因为文件里的数字混用了逗号(比如3,455)和点(比如2.45)作为小数点分隔符,而Java默认的nextDouble()只能识别点作为小数点的格式,带逗号的数字会直接抛出InputMismatchException,根本无法解析。

解决办法:

  • 简单粗暴版:统一修改文件里的格式,把所有逗号换成点;
  • 优雅兼容版:使用DecimalFormat配合指定Locale来解析带逗号的数字,比如欧洲地区的Locale默认用逗号做小数点。

修改后的完整代码示例

下面是修复了两个问题后的代码,还加了异常处理避免单个解析失败导致程序崩溃:

import java.io.File;
import java.util.Scanner;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumbersNew {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(new File("Numbers.txt"));
        sc.useDelimiter("\\s*;\\s*");

        double largest = Double.MIN_VALUE;
        double smallest = Double.MAX_VALUE;

        // 配置支持逗号小数点的数字解析器
        NumberFormat numberFormat = NumberFormat.getInstance(Locale.GERMANY);
        DecimalFormat decimalFormat = (DecimalFormat) numberFormat;
        decimalFormat.setParseBigDecimal(false); // 解析为double类型

        while (sc.hasNext()) {
            String numStr = sc.next().trim();
            try {
                double val = decimalFormat.parse(numStr).doubleValue();
                if (val < smallest) {
                    smallest = val;
                }
                if (val > largest) {
                    largest = val;
                }
            } catch (Exception e) {
                System.err.println("无法解析数字: " + numStr);
                e.printStackTrace();
            }
        }

        sc.close();

        System.out.println("The biggest number in the file is: " + largest);
        System.out.println("The smallest number in the file is: " + smallest);
    }
}

额外提醒

如果你的文件里的逗号其实是千位分隔符(比如3,455是3455而不是3.455),那就要调整解析逻辑,先替换掉逗号再解析,不过从你给出的数值来看,应该是作为小数点使用的,所以上面的代码应该能解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:44:28