Выдает ошибку потока, при применении tab.getId().equals(). Кто подскажет в чем проблема?

КТо поможет помогите разобраться в чем проблема. Код метода и ошибка представлены ниже.
public void getMessage(Response response) {
		String id = response.getFrom();
		for (int i = 0; i < tabPane.getTabs().size(); i++) {
			System.out.println(tabPane.getTabs().get(i).getId());
			Tab tab = tabPane.getTabs().get(i);
			if (tab.getId().equals(id)) {
				VBox vBox = (VBox) tabPane.getTabs().get(i).getContent();
				TextArea textArea = (TextArea) vBox.getChildren().get(0);
				textArea.appendText(response.getFrom() + ": " + response.getMessage());
				break;
			}
		}
	}


Exception in thread "Thread-4" java.lang.NullPointerException
at chat.client.view.ChatController.getMessage(ChatController.java:98)(Это строка if (tab.getId().equals(id)) )
at chat.client.MainApp.onReceiveString(MainApp.java:124)
at chat.client.network.TCPConnection$1.run(TCPConnection.java:37)
at java.lang.Thread.run(Thread.java:748)
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
1) напрягает "Exception in thread "Thread-4" java.lang.NullPointerException", часом не из другого ли потока все работает?
2) Я так предполагаю что (Response response) летит из друго потока? Случаем не подтирается ли к моменту проверки String id?
3) Точно ли существет Tab tab = tabPane.getTabs().get(i)?

Рекомендации
- самое, вот самое САМОЕ, важное, любые операции с ui проводить ТОЛЬКО в потоке javafx.
- просто tab.getId() не вызывает npe? На всякий случай почитай как работает а лучше глянь исходники\доки, возможно что если id не установлен то вернется null а у null нет метода equals и отсюда npe.
-возьми в руки дебаггер, поставь бряк на нужную строку и пошагово смотри что в какой переменной лежит.
- очень критичный момент, не делай кашу в виде приема-обработки-отрисовки в одном месте, это какраз рождает проблемы с потоками. Подсказка, возьми коллекцию которая может многопоток, к примеру сетевой поток получил пакет и закинул ее в коллекцию после чего работает дальше, из этой коллекции 2й поток взял пакет и обрабатывает и по результату уже ,к примеру, отвечает обратно клиенту или отправляет обработанные данные в еще одну коллекцию из которой эти данные подхватит поток javafxui и отрисует. Т.е. сетевой поток получил и положил в коллекцию вообще не думая что там, зачем и куда. Поток бизнеслогики уже переваривает эти данные и решает что куда и как, ui поток не делает собственно ничего а только отрисовывает новые данные.

На самом деле вангую что накосячил с потоками и отсюда такие приколы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы