Java 成绩计算器不会循环到第二个学生

Java 成绩计算器不会循环到第二个学生,java,Java,我最近看到一篇帖子,它试图实现和我一样的目标,但他的代码只针对一个学生,无法实现。我设法解决了他的代码的问题,但有两件事我仍然不明白。当我用名字和姓氏输入学生的名字时,java代码出现错误,程序停止。当我只使用一个名字时,程序会一直运行,但在我计算一个学生的成绩后停止。它不会一直循环,直到我输入的学生数量达到他们的所有成绩 public class proj2 { public static void main(String[] args) { Scanner s = n

我最近看到一篇帖子,它试图实现和我一样的目标,但他的代码只针对一个学生,无法实现。我设法解决了他的代码的问题,但有两件事我仍然不明白。当我用名字和姓氏输入学生的名字时,java代码出现错误,程序停止。当我只使用一个名字时,程序会一直运行,但在我计算一个学生的成绩后停止。它不会一直循环,直到我输入的学生数量达到他们的所有成绩

public class proj2
{
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        System.out.println("Welcome to Gradecalculator!");

        System.out.println("Please enter the number of students:");
        int students = s.nextInt();

        System.out.println("Please enter the number of exams:");
        int exams = s.nextInt();

        int i = 0;
        int studentnumber = 1;

        int sum = 0;
        while (i < students) {

            System.out.println("Enter student " + studentnumber++ + "'s name :");
            String studentname = s.next();

            System.out.println("Enter exam scores :");

            for (; i < exams; i++) {
                int n = s.nextInt();
                sum+=n;

                if (n < 0) {
                    System.out.println("Invalid exam scores, reenter: ");
                }
            }
            double average = sum/exams;
            if (average <= 100 && average >= 90) {
                System.out.println("Letter grade: A");
                System.out.println(studentname + " gets 4 stars! ****");
            }
            if (average <= 89 && average >= 80) {
                System.out.println("Letter grade: B");
                System.out.println(studentname + " gets 3 stars! ***");
            }
            if (average <= 79 && average >= 70) {
                System.out.println("Letter grade: C");
                System.out.println(studentname + " gets 2 stars! **");
            }
            if (average <= 69 && average >= 60) {
                System.out.println("Letter grade: D");
                System.out.println(studentname + " gets 1 star! *");
            }
            if (average <= 59) {
                System.out.println("Letter grade: F");
                System.out.println(studentname + " gets 0 stars!");
            }
        }
    }
}
公共类proj2
{
公共静态void main(字符串[]args){
扫描仪s=新的扫描仪(System.in);
System.out.println(“欢迎使用Gradecalculator!”);
System.out.println(“请输入学生人数:”);
int students=s.nextInt();
System.out.println(“请输入考试次数:”);
int tests=s.nextInt();
int i=0;
int studentnumber=1;
整数和=0;
而(我<学生){
System.out.println(“输入学生”+studentnumber+++”的名字:”;
字符串studentname=s.next();
System.out.println(“输入考试分数:”);
对于(;i<考试;i++){
int n=s.nextInt();
总和+=n;
if(n<0){
System.out.println(“无效考试分数,重新输入:”);
}
}
双倍平均=总和/考试;
如果(平均值=90){
System.out.println(“字母等级:A”);
System.out.println(studentname+“获得四颗星!****”;
}
如果(平均值=80){
系统输出打印项次(“字母等级:B”);
System.out.println(studentname+“获得三星”***);
}
如果(平均值=70){
系统输出打印项次(“字母等级:C”);
System.out.println(studentname+“获得两颗星!**”);
}
如果(平均值=60){
系统输出打印项次(“字母等级:D”);
System.out.println(studentname+“得到一颗星!*”);
}

如果(平均值您使用
i
作为外部(学生)和内部(考试)循环的索引。您应该使用单独的变量以确保内部循环不会干扰外部循环。

您使用
i
作为外部(学生)和内部(考试)循环的索引循环。您应该使用单独的变量来确保内部循环不会干扰外部循环。

当我输入学生的名字时,java代码出现错误,程序停止

我猜您得到的错误是
java.util.InputMismatchException
。这是因为
String studentname=s.next();
只获取一个令牌,当您输入一个包含两个令牌的名称时,如
John Doe
,第二个令牌将保留在输入缓冲区中,并由下一个调用
int n=s.nextInt()解析
这当然行不通。与其使用
String studentname=s.next();
不如使用
String studentname=s.nextLine();
(最好的选择可能是在读取数字时对所有调用使用Integer.parseInt()

另外,当您使用
nextLine()
读取数据时,换行符不会被使用,这意味着当您继续下一个调用时,它仍然在那里,并且将被解析而不是名称(在本例中)。在读取名称之前,可以使用
s.nextLine()
读取空行,或者使用
Integer.parseInt(s.nextLine())
读取数据

您可能还希望使用异常来捕获由于错误输入而导致的错误

另一方面,Java中的类名应以大写字母开头,如

有关详细信息,请参阅文档

另外,正如在另一个答案中所指出的,我遗漏的是,在获取学生姓名的while循环和获取每个学生分数的for循环中使用相同的变量
I
。这不起作用。在第二个循环中,应该使用另一个变量,如
j

for (int j = 0; j < exams; j++) {
                int n = s.nextInt();
                sum+=n;

                if (n < 0) {
                    System.out.println("Invalid exam scores, reenter: ");
                }
            }
for(int j=0;j
理想情况下,您需要使用am面向对象的方法,创建具有相关测试分数的student对象,并将数据读入集合(可能是arrayList)学生,但这可能是课程或练习路径中后期的解决方案。

当我输入学生的姓名时,java代码出现错误,程序停止

我猜您得到的错误是
java.util.InputMismatchException
。这是因为
String studentname=s.next();
只获取一个令牌,当您输入一个包含两个令牌的名称时,如
John Doe
,第二个令牌将保留在输入缓冲区中,并由下一个调用
int n=s.nextInt()解析
这当然行不通。与其使用
String studentname=s.next();
不如使用
String studentname=s.nextLine();
(最好的选择可能是在读取数字时对所有调用使用Integer.parseInt()

另外,当您使用
nextLine()
读取数据时,换行符不会被使用,这意味着当您继续下一个调用时,它仍然在那里,并且将被解析而不是名称(在本例中)。在读取名称之前,可以使用
s.nextLine()
读取空行,或者使用
Integer.parseInt(s.nextLine())
读取数据

您可能还希望对catc使用异常
 for(i=0; i<3; i++){
    System.out.println("What is the Students name?");
    Name = kb.next();//NAME
    System.out.println("What is the Students test score?");
    Grade = kb.nextDouble();//GRADE
    System.out.println();//SKIP SPACE ON SCREEN
    student[i]= new TestScores(Name, Grade); //PASSES ARGUMENT THEN STORES NAME AND GRADE WITH ARRAY ADDRESS  
   } 

    kb.close();