Java使用Scanner读取文本文件如何跳过非整数仅读取0-100范围整数
Java读取文本整数统计功能修复方案
问题根因
- 原代码使用的
skip()正则[a-zA-Z]*仅能匹配大小写字母,无法覆盖空格、标点、特殊符号等其他非整数内容,遇到这类字符后调用nextInt()会直接抛出InputMismatchException导致程序终止 - 没有做「下一个读取单元是否为整数」的前置校验,直接读取整数是崩溃的核心原因
修复逻辑
放弃自行写正则过滤非整数的方案,直接使用Scanner内置的hasNextInt()方法做前置判断:如果下一个单元是整数则读取处理,否则直接跳过该单元,兼容所有非整数场景。
修复后完整代码
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class ScoreStat { public static void main(String[] args) throws FileNotFoundException { Scanner input = new Scanner(System.in); // 输入文件名 System.out.print("Input File's name: " ); String inputFile = input.nextLine(); input.close(); File file = new File(inputFile); Scanner scanFile = new Scanner(file); // 统计变量初始化 int sum = 0; int totalCount = 0; int gradeACount = 0; int minimumScore = 101; // 满分100,初始值设为超过最大值 int maximumScore = -1; // 最低分0,初始值设为低于最小值 float average = 0f; float percentage = 0f; while(scanFile.hasNext()) { if(scanFile.hasNextInt()) { int num = scanFile.nextInt(); if(num >= 0 && num <= 100) { sum += num; totalCount++; if(num >= 90) { gradeACount++; } if(num < minimumScore) { minimumScore = num; } if(num > maximumScore) { maximumScore = num; } } } else { // 非整数内容直接跳过 scanFile.next(); } } scanFile.close(); // 循环结束后统一计算结果 if(totalCount > 0) { average = sum / (float)totalCount; percentage = (gradeACount / (float)totalCount) * 100; // 输出结果 System.out.println("0~100范围内整数总数:" + totalCount); System.out.println("平均值:" + average); System.out.println("90分以上占比:" + percentage + "%"); System.out.println("最小值:" + minimumScore); System.out.println("最大值:" + maximumScore); } else { System.out.println("文件中未找到0~100范围内的有效整数"); } } }
额外优化点
- 把平均值、占比的计算挪到循环结束后执行,避免重复计算提升效率
- 增加了有效整数为空的边界判断,避免除以0报错
- 修正了最值初始值设置逻辑,避免初始值不合理导致统计错误
内容的提问来源于stack exchange,提问作者Amber
相关产品推荐
相关产品推荐

