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 поток не делает собственно ничего а только отрисовывает новые данные.
На самом деле вангую что накосячил с потоками и отсюда такие приколы.