可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want to read in data from a text file which is full of integers and have the program print those integers out to the screen while summing them. This shouldn't be hard, but I can't figure it out!!!
Here is the extremely simplified text file:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
And here is my code that is supposed to work:
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++;
}
}
}
Finally, here is the output I get:
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)
回答1:
You are calling textfile.nextInt() twice in the loop. Try:
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++;
}
}
回答2:
You never increment i
, so the while loop continues beyond the end of the file. As for summing, do something like this.
static void addstuff(Scanner aScanner) {
int sum = 0;
while (aScanner.hasNextInt()) {
sum += aScanner.nextInt();
}
System.out.println(sum);
}
This will run until hasNextInt() returns false, which occurs when the next item the scanner sees isn't an integer. This could be non-numeric input or the end of the file. This means you're no longer limited to 25 integers - it'll read as many as it can before stopping.
回答3:
Because you never increment i
, it never changes from 0, so it is always less than 25. That means it tries to look again after it has done 25 elements, but there is no 26th, so there's an exception.
Instead of a while
loop, I would recommend a for
loop.
To sum them, instead of printing them out, just add to an accumulator.
int accumulator = 0;
for(int i = 0; i < 25; i++)
accumulator += aScanner.nextInt();
System.out.println(accumulator);
should print out the sum.
回答4:
In addition to lockstock's answer, you might want to consider adding textfile.hasNext() OR textfile.hasNextInt() for your while loop.
static void filereader(Scanner textfile) {
int sum = 0;
while(textfile.hasNextInt()) {
int nextInt = textfile.nextInt();
System.out.println(nextInt);
sum += nextInt;
}
}
回答5:
You will have to do following thing
while(i < 25)
{
System.out.println(aScanner.nextInt());
i++ ;
}
回答6:
It throws an exception because you don't increment i
in the loop. In case if the number of integers in the input file is unknown, you can use the Scanner.hasNextInt()
method to check the presence of the next integer (or just use hasNext()
to check for EOF).
You can sum the numbers like in the code snippet below:
...
int sum = 0;
while(i++ < 25)
{
sum += aScanner.nextInt();
}
or
...
int sum = 0;
while(aScanner.hasNextInt())
{
sum += aScanner.nextInt();
}
回答7:
You are getting the error (exception) because your file has very big numbers that do not fit on Integer types. You should use Long.
So, use: aScanner.nextLong()
instead of aScanner.nextInt()
.
EDIT: You should also change the type of the sum
variable from int
to long
.
Your code will work fine.
回答8:
1. Your i
is never Incremented.
2. You are not adding up numbers.
3. addstuff(diskScanner)
is a static memeber
, so call it with class name with dot operator.
Eg:
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);
}