2016-12-03 12 views
-1

Я пытаюсь разработать программу для генерации 10 простых чисел при каждом нажатии кнопки, но я боюсь. Код для идентификации простых чисел является правильным, но я получаю ошибку NullPointerException, вероятно, потому, что я плохо обрабатываю массив меток. Я вставлю код ниже, спасибо за любой отзыв о том, что происходит не так.Массив этикетки. Генератор простых чисел. JavaFX

public class PrimeGenerator extends Application { 

    Button generate; 
    Label listNumbers; 
    int i; 
    int multiple = 2; 
    int number = 2; 
    int z = 1; 
    int t = 0; 
    Label[] primeList; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     VBox root = new VBox(); 
     generate = new Button("Generate 10 more primes!"); 
     generate.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent e) { 
       primeList = new Label[10]; 
       while (i < primeList.length) { 
        multiple = 2; 
        while (multiple < number) { 
         t = number % multiple; 
         if ((t == 0)) { 
          z = 0; 
         } 
         multiple++; 
        } 

        // Here I'd like to add the prime number to the array while also adding the Label to the Vbox 

        if ((z == 1)) { 
         primeList[i].setText(Integer.toString(number)); 
         root.getChildren().add(primeList[i]); 
         i++; 
        } 
        z = 1; 
        number++; 
       } 
      } 
     }); 

     root.getChildren().add(generate); 

     Scene scene = new Scene(root); 
     primaryStage.setTitle("Prime Numbers Generator"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 
} 
+0

Не могли бы вы добавить трассировку стека? –

ответ

1

Я думаю, что вы забыли инициализировать элемент массива

.... 
primeList[i] = new Label(); 
primeList[i].setText(Integer.toString(number)); 
.... 

Вы можете также в одной строке

primeList[i] = new Label(Integer.toString(number)); 

Например

   if ((z == 1)) { 
        primeList[i] = new Label(); 
        primeList[i].setText(Integer.toString(number)); 
        root.getChildren().add(primeList[i]); 
        i++; 
       } 

В качестве альтернативы, вы можете предварительно -создавать элементы i n:

 ... 
     @Override 
     public void handle(ActionEvent e) { 
      primeList = new Label[10]; 
      for(int labelIdx=0; labelIdx<primeList.length; labelIdx++) 
       primeList[labelIdx] = new Label(); 
      while (i < primeList.length) { 
     ... 
+0

Я объявил его вне метода void и инициализировал его в начале кнопки – Davide

+0

@DavideTormene Если вы инициализируете отдельные метки, отредактируйте свой вопрос, чтобы включить код, который выполняет эту инициализацию. –

+0

Я включил весь код, который я написал до сих пор – Davide