Ошибка нулевой точки в массиве при попытке присвоить кнопкам в массиве цвет

#java #arrays #javafx #nullpointerexception #scenebuilder

#java #массивы #javafx #исключение nullpointerexception #scenebuilder

Вопрос:

У меня есть массив, полный нескольких кнопок, и я пытаюсь просмотреть массив и присвоить каждой кнопке цвет, однако я продолжаю получать ошибку исключения с нулевой точкой.

    public static Button[] arrayButtons = new Button[33];                
   @FXML public Button btn1 = new Button();
   @FXML public Button btn2 = new Button();
   @FXML public Button btn3 = new Button();

  @FXML
  public void initializeButtonArray() {        
    arrayButtons[1] = btn1;
    arrayButtons[2] = btn2;
    arrayButtons[3] = btn3;
    arrayButtons[4] = btn4;       
  }

   @FXML
   private void test() {

      initializeButtonArray();
      for(Button btn : arrayButtons) {
          btn.setStyle("-fx-background-color: #FF0000");  //error occurs here
      }
  } 
  

Ошибка возникает, когда я пытаюсь присвоить всем кнопкам цвет внутри моего для каждого цикла.

Комментарии:

1.Вы инициализируете свой Button массив для хранения 33 объектов, но назначаете только 4 из них. Таким образом, остальные 29 остаются null . Также стоит отметить, что Java — это язык с нулевым индексом, поэтому первым элементом в вашем массиве является arrayButtons[0] , not arrayButtons[1] . И, наконец, вы делаете arrayButtons[4] = btn4 , но вы никогда не создавали btn4 в предоставленном вами коде, поэтому этот код никогда не будет скомпилирован как есть.

2. Большое спасибо за вашу помощь, теперь это работает 🙂

Ответ №1:

Массивы начинаются с 0, поэтому вы никогда не устанавливаете arrayButtons[0] ни на что, оставляя это как null ожидание, чтобы выдать NullPointer при вызове. Вы также никогда не инициализируете btn4 , который при вызове выдает нулевой указатель и, наконец, почему вы создаете массив из 33 кнопок, когда вы инициализируете только 3, остальные будут выдавать вы хотите угадать, что это NPE

попробуйте это

 public static Button[] arrayButtons = new Button[4];

public void initializeButtonArray() {  
    arrayButtons[0] = btn1;      
    arrayButtons[1] = btn2;
    arrayButtons[2] = btn3;
    arrayButtons[3] = btn4;      
}
  

Добавьте это

 @FXML public Button btn4;
  

На вашей первой итерации цикла arrayButtons он выдает нулевой указатель, потому что он ищет, arrayButtons[0] но он установлен как null , что прерывает весь ваш цикл

Также, если вы ссылаетесь на FXML, вы не помещаете = new Button();

Комментарии:

1. боже, большое вам спасибо, я такой новичок в кодировании;(, буквально потратил весь день, пытаясь это исправить.

2. Я бы рекомендовал сделать arrayButtons = new Button[] { btn1, btn2, btn3, btn4 }; в initializeButtonArray , поскольку таким образом вам не нужно изменять 2 части кода при изменении количества элементов массива, что уменьшает возможные источники ошибок. Также это короче…

Ответ №2:

Вы инициализировали только несколько элементов в массиве. Другие ссылаются на null.

Измените эту строку кода

 public static Button[] arrayButtons = new Button[33];   
  

Для

 public static Button[] arrayButtons = new Button[4];   
  

Обратите внимание, что массивы начинаются с индекса 0!