Цикл / массив (Java)

#java #loops

#java #циклы

Вопрос:

У меня возникли некоторые проблемы с запуском цикла. Моя цель — создать цикл, который позволит пользователю заполнять лотерейные номера в нескольких строках (пользователь может решить, сколько строк он / она хочет заполнить, но это не может быть больше максимального числа, указанного ранее в коде). Пока что мой код выглядит следующим образом:

 import java.util.Scanner;
public class LotteryTicket {

    public LotteryRow[] rows;
    public int numberOfRows;
    public Player ticketOwner;

    public LotteryTicket(int maxNumberOfRows) {

        this.rows = new LotteryRow[maxNumberOfRows];
    }

    Scanner input = new Scanner(System.in);

    public void fillInTicket() {
        System.out.print("How many rows do you want to fill in? ");
        int n = input.nextInt();
        while (n < 1 || n > rows.length) {
            System.out.println("The number of rows must lie between 1 and "   rows.length);
            System.out.print("How many rows do you want to fill in? ");
            n = input.nextInt();
        }
        for (int index = 0; index < n; index  ) {
            rows[index].fillInRow();
    }
        numberOfRows = n;
    }
  

Когда я пытаюсь запустить это в основном методе и ввожу нужное количество строк, я получаю сообщение об ошибке:

Исключение в потоке «main» java.lang.Исключение NullPointerException в лотерейном билете.Заполненный билет (LotteryTicket.java:24)

Строка 24 — это строка, в которой я вызываю метод fillInRow(), который я создал в другом классе, поэтому я подозреваю, что проблема заключается здесь. Я знаю, что этот метод работает нормально, так как я пробовал его в тестовой программе. Однако, я неправильно ссылаюсь на этот метод fillInRow()?

Любая помощь будет высоко оценена!

Ответ №1:

Вы создали массив с размером maxNumberOfRows , но не заполнили его никакими объектами. Изначально он содержит только нулевые ссылки.

Чтобы исправить код, вы должны вызвать LotteryRow конструктор для создания объекта, а затем поместить ссылку на этот объект в свой массив. Вы можете исправить свой код следующим образом:

 for (int index = 0; index < n; index  ) {
    rows[index] = new LotteryRow();
    rows[index].fillInRow();
}
  

Ответ №2:

Вы должны создать новый объект и поместить его в массив, прежде чем вызывать для него метод. Java-массивы объектов инициализируются всеми нулевыми значениями.

Ответ №3:

Вы никогда не инициализируете rows . Да, вы создаете массив с this.rows = new LotteryRow[maxNumberOfRows]; помощью, но это НЕ создает новый объект LotteryRow для каждой записи массива, поэтому весь массив заполняется null . Вы должны создать объекты LotteryRow самостоятельно