扫描文本文件时计算最大值时出错

Error calculating the max while scanning a text file

提问人:ouryuken 提问时间:7/30/2023 最后编辑:Diego Borbaouryuken 更新时间:7/31/2023 访问量:43

问:

我最近刚开始学习 Java,我正在做一个练习。

我正在尝试读取文本文件并显示最大值、最小值和平均值。到目前为止,我能够输出平均值,但在尝试查找最大值时遇到了问题。我计划将我的最小值作为我的 max+1,但我似乎对最大值有问题。代码在下面,错误输出在下面。谁能告诉我我哪里做错了?

谢谢!

import java.io.*;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        String fileName = "scratch.txt";
        Scanner inputStream = null;
        
        try {
            inputStream = new Scanner(new File(fileName));
        } catch (FileNotFoundException exception) {
            System.out.println("The file: " + fileName + " has not been found, exiting program.");
            System.exit(0);
        }
        
        int sum = 0;
        int i = 0;
        int max = 0;
        int min = 0;
    
        while (inputStream.hasNextInt()) {
            if (inputStream.nextInt() > max) {
                max = inputStream.nextInt();
            }
            sum = +inputStream.nextInt();
            i++;
        }
        
        System.out.println(max);
        System.out.println("The integer average is: " + sum / i);
        inputStream.close();
    }
}

错误输出:

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:945)
    at java.base/java.util.Scanner.next(Scanner.java:1602)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2267)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2221)
    at Main.main(Main.java:27)

文件 输入 java.util.scanner java-io

评论

0赞 Old Dog Programmer 7/30/2023
您到达了文件的末尾,而此时需要 a。这是可能的,因为您的循环测试了 .但是,当 是 时,当只有 1 被保证时,您可以读取 2 或 3。因此,请修复您的代码以在循环中只读取一次。并且不要丢弃此类读取的结果。请记住,每次通话都成功推进。nextIntwhileinputStream.hasNextInt()trueinputStream.nextInt()inputStream.nextIntt()whilenextInt()
0赞 Old Dog Programmer 7/30/2023
查找相关问题: stackoverflow.com/search?q=%5Bjava%5D+NoSuchElementException
3赞 MarsAtomic 7/30/2023
将来,在通过自己的调试工作确定问题之前,应抵制发布帖子的诱惑。十有八九,如果您执行基本调试来尝试诊断问题,您也会发现解决方案。

答:

0赞 rzwitserloot 7/30/2023 #1

每次调用都消耗一个令牌。您在单个循环中调用它多达 3 次(如果“下一个数字”高于最大值,则获取 THAT 之后的数字并将其存储在 中,然后获取之后的数字(因此,总共 3 个数字)并将其相加。如果第一个数字不高,则只需获取第二个数字并将其相加.nextInt()max

您只想在该循环中调用一次。将结果分配给变量,然后对该变量执行 and add 操作。.nextInt()whileif

0赞 g00se 7/30/2023 #2

您现在已经整理好了关于 的评论,但您可能想知道,通过使用流媒体,您可以更轻松地使用 ,以及收集您的统计数据。也许以后在你的研究中要检查一些东西:nextIntScanner

import java.util.Scanner;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.IntSummaryStatistics;

public class Stats {
    public static void main(String[] args) throws Exception {
        try (Scanner s = new Scanner(Files.newBufferedReader(Path.of("scratch.txt")))) {
            IntSummaryStatistics ss = s.tokens().
                mapToInt(Integer::valueOf).
                summaryStatistics();
                System.out.println(ss);
        }
    }
}