#java #arrays #object #for-loop #nullpointerexception
#java #массивы #объект #for-цикл #исключение nullpointerexception
Вопрос:
Этот класс компилируется просто отлично:
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()
метод, но я получаю java.lang.Исключение NullPointerException, исходящее из for loop
:
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
не используется». В чем моя ошибка?
Комментарии:
1. Вы создаете массив, но еще не заполняете его объектами, как вы выясняете, у него есть только нулевые ссылки. Сначала заполните каждый элемент массива
new Student(...)
, прежде чем пытаться его использовать.
Ответ №1:
Здесь вы создаете локальную переменную
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. @Radik Это действительно должен быть комментарий к вопросу.
2. @sirio Если этот ответ решил вашу проблему, пожалуйста, отметьте его как правильный ответ. Это связано с тем, что все сообщения в Stack Overflow предназначены для того, чтобы быть полезными и для будущих посетителей, а сообщения с принятыми ответами обязательно будут более полезными.
Ответ №2:
Именно из-за того, что размер массива изменяет этот код на
public void displayAllStudents(){
for (int i = 0; i < students.length; i ){
students[i].displayStudent();
}
}
если в массиве есть 3 элемента, функция array.length возвращает 3. И вы считаете это от 0, 1, 2,3 yaa есть число 4. он вернет исключение array outof bound или исключение nullpointer .
Комментарии:
1. да, как только я это исправил, я получил Arrayoutofbounds, поэтому я исправил это с
students.length -1
помощью и теперь работает. Спасибо!
Ответ №3:
Смотрите Ссылку для решения: https://github.com/omkar-nibandhe/StackOverflowSolutions/commit/c7aa250caeeed6a3827e0579b174aae59d4f9c22
В ваш класс внесены изменения: «MyClass» для части объявления Student[] .
-Вы вызываете конструктор с размером массива, поэтому инициализируйте Student[] с выбранным вами размером (в данном случае жестко заданным до 10).
Надеюсь, это вам поможет.
Комментарии:
1. Вы должны включить свой код здесь, а не по ссылке.
2. извините. это мой 1-й пост. позаботится об этом в следующий раз.
Ответ №4:
Как мы видим, вы используете массив students, но вы не вызываете конструктор класса student (с аргументом), и, следовательно, они содержат null в качестве сохраненного значения в поле name и дают вам исключение нулевого указателя.
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();
}
}
}