Java 每次我编译项目时,while循环之外的所有内容都不会';不显示(输入来自文件)
编写一个Java程序来读取和处理文本文件的每一行,并打印以下内容 信息(除最后一行外的每一行): 班上的学生人数 每个学生的姓名和平均分数 全班学生平均成绩最高(忽略平局的可能性) 获得最高平均成绩的学生的姓名(忽略平局的可能性) 每个科目的最高分数 它应该读取dat文件中的数据并进行必要的输出,但是while循环外的print语句没有显示出来,我也得到了这个输出,错误如下Java 每次我编译项目时,while循环之外的所有内容都不会';不显示(输入来自文件),java,Java,编写一个Java程序来读取和处理文本文件的每一行,并打印以下内容 信息(除最后一行外的每一行): 班上的学生人数 每个学生的姓名和平均分数 全班学生平均成绩最高(忽略平局的可能性) 获得最高平均成绩的学生的姓名(忽略平局的可能性) 每个科目的最高分数 它应该读取dat文件中的数据并进行必要的输出,但是while循环外的print语句没有显示出来,我也得到了这个输出,错误如下 import java.io.*; import java.util.*; public class Statistics
import java.io.*;
import java.util.*;
public class Statistics {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(new FileReader("C:\\Users\\user\\Desktop\\students.dat"));//Opened file
int math=0,spanish=0,french=0,english=0,count=0,sum,highSpan=0,highMath=0,highFren=0,highEng=0;//Declarations
double avg,highAvg=0;
String name,highName;
highName="";
name = ""; //Prime read
while (name!="ENDDATA"){ //Sentinel condition
count++; //Keeps count of students
name = in.next();
spanish=in.nextInt();
math=in.nextInt();
french=in.nextInt();
english=in.nextInt();
sum = spanish + math + french + english;
avg = sum/4; //Claculates Average
System.out.printf("%s - %.0f\n",name,avg);
if (avg > highAvg){ //Checks for the highest Average
highAvg = avg;
highName = name;
}
if (spanish > highSpan){
highSpan = spanish;
}
if (math > highMath){
highMath = math; //Checks for the highest mark for each subject
}
if (french > highFren){
highFren = french;
}
if (english > highEng){
highEng = english;
}
name = in.nextLine();
}
System.out.printf("Number of students in class is: %d\n",count);
System.out.printf("The highest student average is: %f\n",highAvg);
System.out.printf("The student who made the highest average is: %s\n",highName);
System.out.printf("The highest Spanish mark is: %d\n",highSpan);
System.out.printf("The highest Math mark is: %d\n",highMath);
System.out.printf("The highest French mark is: %d\n",highFren);
System.out.printf("The highest English mark is: %d\n",highEng);
in.close(); //Closing of file
}
}
可能是因为while循环中的name=in.next()和name=in.nextLine(),我认为一个就足够了。 例如: name=in.next()
做{
..…
..
name=in.next();
}而(名称!=“ENDDATA”) 问题似乎出在
french=in.nextInt()
行。正如所说,nextInt()
在没有更多的输入可读取时,将抛出一个NoTouchElementException
public int nextInt()
抛出:
NoTouchElementException-如果输入用尽
可能您在student.dat
中的一个条目没有按您期望的方式填写。在.nextInt()中抛出了NoTouchElementException
您的文件似乎包含不正确的数据
您的while循环将永远不会中断,因为您的条件:
MARY - 65
SHELLY - 70
JOHN - 60
ALFRED - 71
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Statistics.main(Statistics.java:17)
永远都是真的。这就是为什么当所有令牌都用完时,scanner对象抛出NosTouchElementException。由于异常,while循环之后的print语句不会执行
尝试使用scanner的hasNext()方法检查下一个令牌
用这个while替换while循环
while(name!="ENDDATA")
Students.dat文件格式应如下所示:
while (in.hasNext()){ //Sentinel condition
count++; //Keeps count of students
name = in.next();
if(name.equals("ENDDATA")){
break;
}
spanish=in.nextInt();
math=in.nextInt();
french=in.nextInt();
english=in.nextInt();
sum = spanish + math + french + english;
avg = sum/4; //Claculates Average
System.out.printf("%s - %.0f\n",name,avg);
if (avg > highAvg){ //Checks for the highest Average
highAvg = avg;
highName = name;
}
if (spanish > highSpan){
highSpan = spanish;
}
if (math > highMath){
highMath = math; //Checks for the highest mark for each subject
}
if (french > highFren){
highFren = french;
}
if (english > highEng){
highEng = english;
}
}
这一定是因为您的
while
循环尚未完成。检查您的数据。由于MARY、SHELLY等成功打印,因此特定学生的数据一定有问题。您的错误表明nextInt
正在抛出错误并终止程序。你应该检查你的文件,并确保你试图阅读的项目确实是一个int。如果你用最小的students.dat的内容更新你的问题将是最好的,这将导致此错误发生。问题?如果在文件的底部有ENDDATA,并且我想使用它作为sentinel值来终止循环,我该怎么做
Shelly 2 2 3 4
Brown 34 2 1 4
Pink 23 45 21 1
ENDDATA