Ошибка NullPointerException в JavaFx

95
03 февраля 2022, 21:10

делаю чат на java, но столкнулся с ошибкой и не понимаю, как ее решить.
Ошибка:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at sample.ClientServer.lambda$run$0(ClientServer.java:25)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:835)

Я получаю на сервер сообщение, которое должен распечатать в TextArea, но получаю ошибку NullPointerException при попытке вывода текста в TextArea с помощью TextArea.appendText(msg).
Код сервера:

package sample;
import javafx.fxml.FXMLLoader;
import javafx.scene.text.Text;
import sample.Controller;
import sample.chatcontroller;
import javafx.application.Platform;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
class ClientServer extends chatcontroller implements Runnable {
    @Override
    public void run() {
        FXMLLoader loader = new FXMLLoader();
        chatcontroller ctrl = loader.getController();
        while (true) {
            try (ServerSocket serverSocket = new ServerSocket(ClientPort)) {
                Socket socket = serverSocket.accept();
                Scanner scanner = new Scanner(socket.getInputStream());
                ServerPort = Integer.parseInt(scanner.nextLine());
                String msg = scanner.nextLine();
                Platform.runLater(()->ctrl.TextArea.appendText(msg)); //тут ошибка
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Код от Controller.java

package sample;
public class chatcontroller{
    public static String name = "client";
    public static int ClientPort = 6777;
    public static int ServerPort = 7777;
    @FXML
    private TextField messagefield;
    @FXML
    private Button sendbutton;
    @FXML
    private Button exitbutton;
    @FXML
    private Button configbutton;
    @FXML
    private Button onlyadminbutton;
    @FXML
    public TextArea TextArea;
    @FXML
    void initialize() {
        new Thread(new ClientServer()).start();
        exitbutton.setOnAction(event -> {
            exitbutton.getScene().getWindow().hide();
            FXMLLoader loader1 = new FXMLLoader();             //выход из чата
            loader1.setLocation(getClass().getResource("sample.fxml"));
            try {
                loader1.load();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Parent root1 = loader1.getRoot();
            Stage stage1 = new Stage();
            stage1.setScene(new Scene(root1));
            stage1.showAndWait();
        });
        sendbutton.setOnAction(e -> {
            String input = messagefield.getText();
            if (!input.isEmpty()) {
                SendMSG(input);
                Platform.runLater(()->TextArea.appendText("Пользователь " + name + " написал " + input + "\n"));
                messagefield.clear();
            }
        });
    }
}

Код chat.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane prefHeight="400.0" prefWidth="600.0"  xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.chatcontroller">
   <children>
      <TextField fx:id="messagefield" layoutX="25.0" layoutY="332.0" prefHeight="26.0" prefWidth="457.0" promptText="Введите ваше сообщение" />
      <Button fx:id="sendbutton" layoutX="503.0" layoutY="332.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="71.0" text="Send" />
      <Text layoutX="257.0" layoutY="40.0" strokeType="OUTSIDE" strokeWidth="0.0" text="AMchat">
         <font>
            <Font size="24.0" />
         </font>
      </Text>
      <Button fx:id="exitbutton" layoutX="221.0" layoutY="367.0" mnemonicParsing="false" text="Exit" />
      <Button fx:id="configbutton" layoutX="25.0" layoutY="367.0" mnemonicParsing="false" text="Configuration" />
      <Button fx:id="onlyadminbutton" layoutX="129.0" layoutY="367.0" mnemonicParsing="false" text="Only Admin" />
      <TextArea fx:id="TextArea" editable="false" layoutX="29.0" layoutY="46.0" prefHeight="280.0" prefWidth="546.0" />
   </children>
</AnchorPane>
Answer 1

Решение проблемы - передать контроллер классу сервера,

  1. В классе сервера объявить поле static Chatcontroller ccr;
  2. В методе initialize() у контроллера, передать контроллер через класс ClientServer.ccr = this
    В результате передачи контроллера, можно будет обратиться к TextArea в классе контроллера ccr.textarea.appendText(msg);

Спасибо пользователю @PerfectVoyage за решение проблемы.

READ ALSO
IndexOutOfBoundsException

IndexOutOfBoundsException

Ошибка:

89
Как закрепить flex элемент справа сверху?

Как закрепить flex элемент справа сверху?

В флекс каталоге есть меню и товары, как закрепить меню в правом верхнем углу так, чтобы товары обтекали его слева и снизу? https://jsfiddlenet/4roj2ced/

163
Как изменить прозрачность элемента при прокрутке страницы?

Как изменить прозрачность элемента при прокрутке страницы?

Есть текст на странице, у него opacity стоит 0, и как только пользователь его увидит (к примеру прокрутит страницу) то у него должна стать opacity 1 с неким...

99
Двойное нажатие на кнопку

Двойное нажатие на кнопку

Спасибо вашему сайту за помощь

117