这个类编译得很好:
public class Student{
//define variables
static String name;
//define constructor
public Student(String n){
name = n;
}
//define method to display name
public static void displayStudent(){
System.out.println("Name: " + name);
}
}
这是我尝试调用displayStudent()
方法的类,但是我收到来自for loop
的java.lang.NullPointerException异常:
public class MyClass{
//define array of object Student
private Student[] students;
//constructor
MyClass(int size){
Student[] students = new Student[size];
}
//define method to display the students variable
public void displayAllStudents(){
for (int i = 0; i <= students.length; i++){
students[i].displayStudent();
}
}
我正在尝试用Eclipse修复它,但它说在MyClass中“不使用局部变量students
的值”。我的错误在哪里?
答案 0 :(得分:2)
您在这里创建一个局部变量
MyClass(int size){
// only exists inside this scope.
Student[] students = new Student[size];
}
但这对于这个构造函数是本地的,所以你马上扔掉它。我假设您打算设置字段 students
MyClass(int size) {
students = new Student[size];
}
注意:所有这一切都是创建一个对学生的引用数组,这些引用都是null
。所以你还需要为每个索引创建一个Student对象
MyClass(int size) {
students = new Student[size];
for (int i = 0; i < size; i++)
students[i] = new Student();
}
注意常见模式如何使用<
而非<=
您的打印循环必须是
for (int i = 0; i < students.length; i++){
或
for (int i = 0; i <= students.length-1; i++){
索引从0
开始,如果您有n
个元素,则最后一个元素为n-1
P.S。 你可能并不是说变量“name”是静态的。 通过使其成为静态,“Student”的所有实例将共享相同的名称。
答案 1 :(得分:1)
这是因为该数组大小 将该代码更改为
public void displayAllStudents(){
for (int i = 0; i < students.length; i++){
students[i].displayStudent();
}
}
如果一个数组有3个元素array.length函数返回3.你从0,1,2,3 yaa计算它有4个数字。它将返回数组outof bound异常或nullpointer异常。
答案 2 :(得分:1)
请参阅解决方案的链接: https://github.com/omkar-nibandhe/StackOverflowSolutions/commit/c7aa250caeeed6a3827e0579b174aae59d4f9c22
在您的班级中进行了更改:“MyClass”用于学生[]的声明部分。
- 您正在调用具有数组大小的构造函数,因此使用您选择的大小初始化Student [](在这种情况下硬编码为10)。
希望这会对你有所帮助。
答案 3 :(得分:0)
我们可以看到你正在使用学生数组,但你没有调用学生类的构造函数(带参数),因此它们在名称字段中包含null作为存储值,并为您提供空指针异常。
class MyClass{
//define array of object Student
private Student[] students;
//constructor
MyClass(int size){
Student[] students = new Student[size];
}
//define method to display the students variable
public void displayAllStudents(){
for (int i = 0; i <= students.length; i++){
students[i].displayStudent();//this will give null pointer execption because student
// objects are not inisialised and cointains null
}
}
}
但是这段代码不会给出空指针异常。
class MyClass{
//define array of object Student
private Student[] students;
//constructor
MyClass(int size){
Student[] students = new Student[size];
for(int i=0;i<size;i++){
students[i]=new Student("the string value");
}
}
//define method to display the students variable
public void displayAllStudents(){
for (int i = 0; i <= students.length; i++){
students[i].displayStudent();
}
}
}