Java读取文件计算数值总和与平均值时遇异常及跳读问题求助
问题分析与解决方案
异常原因
原代码未给while循环加大括号时,循环仅作用于下一行的System.out.println(bru.nextDouble());语句。当循环耗尽文件中所有数值后,后续的value = bru.nextDouble();和System.out.println(bru.nextDouble());仍会尝试读取不存在的元素,直接触发NoSuchElementException。
加括号后出现“读取一个跳过一个”的问题,本质是循环中重复调用nextDouble()——每次调用都会让Scanner指针移动到下一个元素,多次调用就会跳过中间的数值。
修正代码(实现求和与平均值)
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Project4 { public static void main(String[] args) throws FileNotFoundException { System.out.println("Enter the name of the file :"); Scanner scan = new Scanner(System.in); String filename = scan.next(); scan.close(); Scanner bru = new Scanner(new File(filename)); int num = bru.nextInt(); System.out.println("The file " + filename + " has " + num + " numbers in it"); System.out.println("Content of file is"); double total = 0.0; int count = 0; while(bru.hasNextDouble() && count < num) { double currentValue = bru.nextDouble(); System.out.println(currentValue); total += currentValue; count++; } bru.close(); if(count > 0) { double average = total / count; System.out.println("Total sum: " + total); System.out.println("Average: " + average); } else { System.out.println("No valid numbers found in the file."); } } }
关键修正点
- 避免重复读取:每次循环仅调用一次
nextDouble(),将读取到的数值存入变量,后续打印、累加都使用该变量,不会跳过元素。 - 循环边界控制:同时判断
hasNextDouble()和count < num,既防止文件提前结束,也避免读取超出声明的数值个数。 - 资源关闭:及时关闭不再使用的Scanner,避免资源泄漏。
- 安全计算平均值:先判断是否有有效数值,避免出现除以0的异常。
内容的提问来源于stack exchange,提问作者zflocka
相关产品推荐
相关产品推荐

