Java 每次我编译项目时,while循环之外的所有内容都不会';不显示(输入来自文件)

Java 每次我编译项目时,while循环之外的所有内容都不会';不显示(输入来自文件),java,Java,编写一个Java程序来读取和处理文本文件的每一行,并打印以下内容 信息(除最后一行外的每一行): 班上的学生人数 每个学生的姓名和平均分数 全班学生平均成绩最高(忽略平局的可能性) 获得最高平均成绩的学生的姓名(忽略平局的可能性) 每个科目的最高分数 它应该读取dat文件中的数据并进行必要的输出,但是while循环外的print语句没有显示出来,我也得到了这个输出,错误如下 import java.io.*; import java.util.*; public class Statistics

编写一个Java程序来读取和处理文本文件的每一行,并打印以下内容 信息(除最后一行外的每一行): 班上的学生人数 每个学生的姓名和平均分数 全班学生平均成绩最高(忽略平局的可能性) 获得最高平均成绩的学生的姓名(忽略平局的可能性) 每个科目的最高分数

它应该读取dat文件中的数据并进行必要的输出,但是while循环外的print语句没有显示出来,我也得到了这个输出,错误如下

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