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
相关产品推荐
相关产品推荐

