Błąd NullPointerException w aplikacji pokazującej wiadomości

0

w kontrolerze mam napisaną funkcję run która działa w tle programu, w pliku aplikacja wywołuję funkcję która powinna wywoływać się co 5 sekund, funkcja się wywołuje lecz z niewiadomych przyczyn pokazuje mi błąd

java.lang.NullPointerException: Cannot invoke "javafx.scene.layout.VBox.getChildren()" because "this.vBoxMessages" is null

gdzie mogę szukać błędu?
kontroler

@Override
public void run()
{
    while(true)
    {
        try
        {
            System.out.println("proba odczytania wiadomosci");
            pobierz_ostatnie_wiadomosci();
            Thread.sleep(5000);
        }
        catch(Exception e)
        {
        }
    }
}

wywołanie mojej funkcji

@Override
public void start(Stage primaryStage) throws Exception{

///    odwiezanie s=new odwiezanie();
//    s.start();
    kontrolerGlowny n=new kontrolerGlowny();
    n.start();
    stg = primaryStage;
    primaryStage.setResizable(false);
    Parent root = FXMLLoader.load(getClass().getResource("start.fxml"));
    primaryStage.setTitle("Chat A&M");
    primaryStage.setScene(new Scene(root, 1000, 600));
    primaryStage.show();
}

funkcja która powinna wywoływać się co 5 sekund

public void pobierz_ostatnie_wiadomosci()//pobranie ostatnich wiadomosci
{
    try {
        Scanner odczyt = new Scanner(new File("user.txt"));
        String nadawca = odczyt.nextLine();

        Scanner odczyt2 = new Scanner(new File("user2.txt"));
        String odbiorca = odczyt2.nextLine();
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection = DriverManager.getConnection(url, username, password);
        Statement statement = connection.createStatement();

        ResultSet resultSet = statement.executeQuery("select * from wiadomosci where id  >'"+ostatnia_wiadomosc+"' AND (nadawca = '"+nadawca+"' and odbiorca = '"+odbiorca+"'|| nadawca = '"+odbiorca+"' and odbiorca = '"+nadawca+"')");



        while (resultSet.next()) {

            HBox hBox = new HBox();
            Text user = new Text(resultSet.getString("nadawca"));

            hBox.setPadding(new Insets(5, 5, 5, 10));
            Text text = new Text(resultSet.getString("wiadomosc"));
            TextFlow textFlow = new TextFlow(text);

            if(resultSet.getString("nadawca").equals(nadawca))
            {
               // System.out.println("wykonanie");
                hBox.setAlignment(Pos.CENTER_RIGHT);
                textFlow.setStyle(
                        "-fx-font-size:15px;"+
                        "-fx-color: rgb(239, 242, 255);" +
                                "-fx-background-color: rgb(15, 125, 242);" +
                                "-fx-background-radius: 20px;");
            }
            else
            {
                hBox.setAlignment(Pos.CENTER_LEFT);
                textFlow.setStyle("-fx-font-size:15px;"+
                        "-fx-background-color: rgb(233, 233, 235);" +
                                "-fx-background-radius: 20px;");
            }



            textFlow.setPadding(new Insets(5, 10, 5, 10));


            hBox.getChildren().add(textFlow);
            vBoxMessages.getChildren().add(hBox);

            ostatnia_wiadomosc= Integer.parseInt(resultSet.getString("id"));
        }
        connection.close();
    }
    catch(Exception e)
    {
        System.out.println(e);
    }

}
1
Arteee napisał(a):

gdzie mogę szukać błędu?

Gdzie?
Najpierw linii, która jest podana w pełnym komuniakcie. BTW ten nowy null poiunter exception(od Javy 15 ... 17) to daje w zasadzie gotowiec, siaść i poprawić.

a jak ?
za pomocą debugera, to konieczna umiejętnosć

3
  1. Jak chcesz w JavaFX wykonywać jakieś zadania w tle co 5 sekund to raczej polecałbym Ci zapoznać się z jakimś Timerem albo Executorem. Linki:
    https://stackoverflow.com/questions/29733004/properly-doing-multithreading-and-thread-pools-with-javafx-tasks
    https://stackoverflow.com/questions/9966136/javafx-periodic-background-task
    Zamiast robić jakieś dzikie while.

  2. Robiąc apki w JavaFX i chcą zmieniać status GUI musisz się upewnić czy aktualny wątek należy do FX'a.
    https://jenkov.com/tutorials/javafx/concurrency.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1