文本文件数据读取异常导致睡眠质量平均分始终输出0的问题求助
文本文件数据读取异常导致睡眠质量平均分始终输出0的问题求助
看起来你遇到了一个数据解析的小bug,导致睡眠质量的平均分一直输出0,我来帮你梳理下问题出在哪以及怎么修复:
核心问题分析
你在计算睡眠质量平均分(av2)的代码块里犯了一个关键的解析错误:
- 你的数据格式是
睡眠时间 // 睡眠质量 // 改进建议,但你在读取时,错误地把睡眠时间的字符串(比如7.2)去转成int类型,而不是去读取分割后的第二个部分(也就是睡眠质量的数值)。 - 因为睡眠时间是带小数的double字符串,转int会抛出
NumberFormatException,而你在catch块里直接忽略了这个异常,没有做任何处理,导致存储睡眠质量的列表一直是空的,av2始终是0,最后输出0/7也就是0。
具体修复步骤
修正睡眠质量的解析逻辑
把计算av2的代码块里,从解析parts[0]改成解析parts[1],同时优化分割和异常提示逻辑,避免空行或格式错误的行影响结果:try { File file = new File("data.txt"); Scanner scanner = new Scanner(file); ArrayList<Integer> sleepQualityList = new ArrayList<>(); // 重命名变量让语义更清晰 while (scanner.hasNextLine()) { String line = scanner.nextLine().trim(); if (line.isEmpty()) continue; // 跳过空行 String[] parts = line.split(" // "); // 用完整的分隔符分割,避免多余空格干扰 if (parts.length < 2) continue; // 跳过格式错误的行 String qualityStr = parts[1].trim(); try { int quality = Integer.parseInt(qualityStr); sleepQualityList.add(quality); } catch (NumberFormatException ex) { System.out.println("解析睡眠质量失败,跳过该行:" + line); } } int startIndex = Math.max(0, sleepQualityList.size() - 7); for (int w = startIndex; w < sleepQualityList.size(); w++) { av2 += sleepQualityList.get(w); } scanner.close(); } catch (FileNotFoundException e) { System.out.println("File not found."); e.printStackTrace(); }其他可以优化的小细节
- 不需要创建两个
Scanner对象读取输入,一个Scanner就足够,避免出现输入读取的异常:Scanner in = new Scanner(System.in); // 移除多余的Scanner inpart2 = new Scanner(System.in); - 读取改进建议前,要先处理之前
nextInt()留下的换行符,避免直接读取到空字符串:// 在读取改进建议前,先消费掉换行符 in.nextLine(); System.out.println("What could be improved?"); ip = in.nextLine(); - 把睡眠质量的输入验证改成循环,直到用户输入合法值,而不是只提示一次:
System.out.println("Sleep quality 1-10"); do { while (!in.hasNextInt()) { System.out.println("请输入整数类型的有效评分(1-10)"); in.next(); } q = in.nextInt(); if(q>10||q<1){ System.out.println("Invalid input,请输入1-10之间的数值"); } } while(q>10||q<1);
- 不需要创建两个
测试验证
修复后,用你提供的样本数据测试的话,睡眠质量分别是4、8、9、8、10、3、2,总和是44,整数除法下输出6/10 quality,如果你想要小数结果,可以把av2改成double类型,计算时用(double)av2/7。
备注:内容来源于stack exchange,提问作者Almost A Mammal
相关产品推荐
相关产品推荐

