Взаимодействие классов ObjectInputStream, ObjectOutputStream, Runnable с JavaFX

179
19 марта 2022, 10:40

В общем, в потоке JavaFX у меня запускаются два других потока Server и Client. Соответственно нужно как-то в клиент из потока JavaFX передать параметр writeObject, но когда я пытаюсь это сделать вылетает NullPointerException.. При использовании Service и Task вообще ничего не происходило... Как передать информацию из этого *** JavaFX в другой поток или в чём тут ещё может быть проблема?

public class Main extends Application {
    Client c = new Client();
    public void start(Stage stage) throws Exception{
        try {
            menu = FXMLLoader.load(Main.class.getResource("smth.fxml"));
            loading = FXMLLoader.load(Main.class.getResource("paw.fxml"));
            game = FXMLLoader.load(Main.class.getResource("game.fxml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        scene1 = new Scene(menu);
        scene = new Scene(loading);
        scene2 = new Scene(game);
        Main.stage = stage;
        stage.initStyle(StageStyle.UNDECORATED);
        stage.setScene(scene);
        stage.show();
        new Timeline(new KeyFrame(Duration.millis(1500), actionEvent -> {
            stage.setScene(scene1);
        })).play();
    }
    @FXML
    private Button b1;
    @FXML
    public void initialize() {
        b1.setOnAction(ae -> {
            new Thread(c).start();
            c.sendData("Hello");
        });
    }
}
public class Client implements Runnable {
    private static Socket connection;
    private static ObjectInpurStream input;
    private static ObjectOutputStream output;
    public void run() {
        try {
            connection = new Socket(InetAddress.getByName(IP), 3112);
            output = new ObjectOutputStream(connection.getOutputStream());
            input = new ObjectInputStream(connection.getInputStream());
        } catch (IOException e) {
        e.printStackTrace();
        }
    }
    public void sendData(Object object){
        try {
            output.writeObject(object);
            output.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

В общем есть ещё сервер, но не думаю, что его надо описывать.. Клиент к нему подключается, там всё нормально работает. Но, когда я пытаюсь отправить эту несчастную строчку, вылетает NullPointerException... В общем-то я новичок в Java, поэтому тяжело сообразить куда копать надо

Answer 1

У вас инициализация поле output происходит в новом потоке, а send в основном потоке, так во время output.writeObject(), output ещё не успел инициализироваться .

READ ALSO
Retrofit 2 Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

Retrofit 2 Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

Собственно, ошибка, как у всех, делаю как в ответах здесь, но работает неправильно

129
Ошибка при запуске теста xlsx создания

Ошибка при запуске теста xlsx создания

Хотя библиотке poi скачал полностью и добавил в проект

75
Получение изображения из AWS S3 для использования на сайте. Java

Получение изображения из AWS S3 для использования на сайте. Java

Я разобрался как загружать файл в bucket aws s3, научился его скачивать в директорию на компьютереНо не могу понять каким способом загружать файлы...

88