2

我想从一个充满整数的文本文件中读取数据,并让程序在对它们求和时将这些整数打印到屏幕上。这应该不难,但我想不通!!!

这是极其简化的文本文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

这是我应该工作的代码:

import java.util.*;
import java.io.File;
import java.io.IOException;

public class ReadFile
{
    public static void main(String[] args)
    throws IOException
    {
        Scanner textfile = new Scanner(new File("Some_Numbers.txt"));

        filereader(textfile);
    }   


    static void filereader(Scanner textfile)
    {
        int i = 0;
        int sum = 0;

        while(i <= 19)
        {
            System.out.println(textfile.nextInt());
            sum = sum + textfile.nextInt();
            i++;
        }
    }



}

最后,这是我得到的输出:

1
3
5
7
9
11
13
15
17
19
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:838)
    at java.util.Scanner.next(Scanner.java:1461)
    at java.util.Scanner.nextInt(Scanner.java:2091)
    at java.util.Scanner.nextInt(Scanner.java:2050)
    at ReadFile.filereader(ReadFile.java:23)
    at ReadFile.main(ReadFile.java:12)
4

8 回答 8

4

您永远不会递增i,因此 while 循环会继续超出文件末尾。至于求和,做这样的事情。

static void addstuff(Scanner aScanner) {
        int sum = 0;

        while (aScanner.hasNextInt()) {
            sum += aScanner.nextInt();
        }

        System.out.println(sum);
}

这将一直运行,直到hasNextInt()返回 false,当扫描仪看到的下一个项目不是整数时会发生这种情况。这可能是非数字输入或文件结尾。这意味着您不再局限于 25 个整数 - 它会在停止之前尽可能多地读取。

于 2012-08-08T16:59:20.977 回答
4

因为你从不递增i,所以它永远不会从 0 改变,所以它总是小于 25。这意味着它会在完成 25 个元素后尝试再次查看,但没有第 26 个,所以有一个例外。

while我建议使用循环而不是for循环。

总结它们,而不是打印出来,只需添加到累加器中。

int accumulator = 0;
for(int i = 0; i < 25; i++)
    accumulator += aScanner.nextInt();

System.out.println(accumulator);

应该打印出总和。

于 2012-08-08T16:59:38.960 回答
3

您在循环中调用 textfile.nextInt() 两次。尝试:

static void filereader(Scanner textfile)     
{         
    int i = 0;         
    int sum = 0;          
    while(i <= 19)         
    {       
        int nextInt = textfile.nextInt();          

        System.out.println(nextInt);             
        sum = sum + nextInt;
        i++;         
    }     
}
于 2012-08-09T01:15:41.530 回答
2

除了 lockstock 的答案之外,您可能还需要考虑为您的 while 循环添加 textfile.hasNext() 或 textfile.hasNextInt() 。

static void filereader(Scanner textfile) {
int sum = 0;          
while(textfile.hasNextInt()) {
    int nextInt = textfile.nextInt();
    System.out.println(nextInt);
    sum += nextInt;
}

}

于 2012-08-09T01:25:27.063 回答
1

你将不得不做以下事情

    while(i < 25)
    {
        System.out.println(aScanner.nextInt());
        i++ ;
    }
于 2012-08-08T17:02:02.747 回答
1

它会引发异常,因为您不会i在循环中递增。如果输入文件中的整数个数未知,您可以使用该Scanner.hasNextInt()方法检查下一个整数是否存在(或仅用于hasNext()检查 EOF)。

您可以像下面的代码片段一样对数字求和:

    ...
    int sum = 0;
    while(i++ < 25)
    {
        sum += aScanner.nextInt();
    }

或者

    ...
    int sum = 0;
    while(aScanner.hasNextInt())
    {
        sum += aScanner.nextInt();
    }
于 2012-08-08T17:04:41.500 回答
1

您收到错误(异常),因为您的文件有非常大的数字,不适合Integer类型。你应该使用Long

所以,使用:aScanner.nextLong()而不是aScanner.nextInt().

编辑:您还应该将sum变量的类型从更改intlong

您的代码将正常工作。

于 2012-08-08T18:48:39.550 回答
0

1.i永远不会增加。

2.没有把数字相加。

3. addstuff(diskScanner)是 a static memeber,所以用带点运算符的类名来调用它。

例如:

Add.addstuff(diskScanner);

   static void addstuff(Scanner aScanner)
{
    int i = 0;
    long l = 0;


    while(i < 25)
    {
        l = i + l;
        i++;
    }

    System.out.println(l);



}
于 2012-08-08T17:07:33.563 回答