我正在从网站上进行java编程实践。我必须使用数组显示这个输出。
Enter the number of students: 3
Enter the grade for student 1: 55
Enter the grade for student 2: 108
Invalid grade, try again...
Enter the grade for student 2: 56
Enter the grade for student 3: 57
The average is 56.0
到目前为止,这是我的源代码,它引发了错误The local variable grades may not have been initialized
。我该如何恢复?我必须使用数组制作这个程序。
package array;
import java.util.Scanner;
public class GradesAverage {
public static void main(String[] args) {
int numStudents = 0;
int[] grades;
Scanner in = new Scanner(System.in);
System.out.print("Enter number of students : ");
numStudents = Integer.parseInt(in.next());
for (int i = 0; i < numStudents; i++) {
System.out.print("Enter grade of student "+i+" :");
grades[i] = Integer.parseInt(in.next());
}
}
}
答案 0 :(得分:0)
写作时
int[] grades;
您声明了一个名为grades
的变量,该变量可以包含int[]
类型的值。但是,在使用它之前,您还必须初始化,例如创建实际的数据结构。这是这样做的:
int[] grades = new int[numStudents];
请注意,在声明array
时需要事先知道大小,因此必须将数组的创建移到for
循环之前。
答案 1 :(得分:0)
在读取方法中声明的所有变量之前,必须为它们分配一个值以避免垃圾值。
同样在java数组中是对象,这意味着您必须使用new
创建一个数组实例,并将其分配到等级,然后才能在其中存储任何内容。
grades = new int[numStudents];
答案 2 :(得分:0)
数组没有恒定的内存分配,因此必须为新数组分配内存。
例如
int[] grades = new int [numStudents]
这当然应该在你知道numStudents
的价值后才能写出来答案 3 :(得分:0)
Keppil已经说过的内容并不多,但我想补充一点'为什么'。
你看,当创建int []成绩时,它只是一个“空指针”,指向内存中的随机位置。
通过指定'new int [numGrades]'的返回值,指针的值指向已分配的内存中的位置。此内存的大小为“整数大小乘以成绩数”,可以安全访问。
如果此数组的大小太小(或根本不存在),则通常会触发内存冲突异常,因为您正在编写无法访问的内存,这通常会导致程序崩溃或其他未定义的行为。
请记住:数组与普通变量不同。
所以是的,简而言之:
grades = new int [numGrades];是你在找什么。 直接在线下方,您正在解析输入的学生数。
作为补充建议:用户输入始终是错误的来源。 确保包含无效输出的错误处理。 (例如,如果某些明智的人决定输入'John Smith'而不是等级。
答案 4 :(得分:0)
您必须在使用之前初始化变量。
请参阅您的代码的正确版本之一:
package array;
import java.util.Scanner;
public class GradesAverage {
public static void main(String[] args) {
int numStudents = 0;
int[] grades;
Scanner in = new Scanner(System.in);
System.out.print("Enter number of students : ");
numStudents = in.nextInt();
// this line was added
grades = new int[numStudents];
for (int i = 0; i < numStudents; i++) {
System.out.print("Enter grade of student "+i+" :");
grades[i] = Integer.parseInt(in.next());
}
// closing used resources is a good practice
in.close();
}
}