Пишу простой чат на Java FX, сам чат работает, не работает только вывод списка пользователей в textArea. Суть проблемы в следующем: в поточном классе приходят логины пользователей в виде строки, я преобразую их в массив и через промежуточный класс Temp передаю в класс ChatController, так же в поточном классе я запускаю метод, который должен выводить в textArea этот массив логинов. UserArea.appendText(arr[i]); в этой строке программа выдает NullPointerExeption
поточный класс:
package StartMain;
import StartMain.View.AuthorizationController;
import StartMain.View.ChatController;
import StartMain.View.Temp;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class ThreadInpOut {
private Client client;
Client cl = new Client();
int doOnce;
private Socket connection;
private ObjectInputStream input; // для принятия сообщений с сервера
private ObjectInputStream inp;
private ObjectOutputStream output; // переменная для отправки клиенту
private java.lang.Thread InputOutput; //поток на прием
private java.lang.Thread logToDrop; //поток на прием
String login;
int reg = 0;
Temp tmp = new Temp();
int once = 0;
int startMesseging = 1;
AuthorizationController controller = new AuthorizationController();
public void Close() throws Exception {
connection.close();
InputOutput.stop();
once = 1;
}
public void init() throws IOException {
initInput();
InputOutput.start();
}
private void initInput() {
InputOutput = new java.lang.Thread(new Runnable() {
@Override
public void run() {
try {
try {
// connection = new Socket("192.168.43.68", 1025); // в клиенте надо указывать ip сервера и порт
connection = new Socket("127.0.0.1", 1025); // в клиенте надо указывать ip сервера и порт
input = new ObjectInputStream(connection.getInputStream());
output = new ObjectOutputStream(connection.getOutputStream()); //инициализируем переменную, передаем через сеть
doOnce = 0;
while (once == 0) {
while (doOnce == 0) {
String ent;
ent = (String) input.readObject();
System.out.println("ent " + ent);
if (ent.equals("EnterSucsess")) {
doOnce = 1;
}
tmp.setEnt(ent);
}
String ent;
input = new ObjectInputStream(connection.getInputStream());
ent = (String) input.readObject();
String[] enterList = ent.split("@");
if (enterList[0].equals("list")) {
System.out.println("Пришел лист логинов");
int i = 0;
while (i < enterList.length) {
System.out.println("listLogin " + enterList[i]);
i++;
}
System.out.println(" \n");
cl.setListLogin(enterList);
ChatController chat = new ChatController();
chat.writeUsers();
} else if (enterList[0].equals("mes")) {
//System.out.println("new messege");
System.out.println(enterList[1]);
}
}
} catch (IOException ex) {
Logger.getLogger(AuthorizationController.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(AuthorizationController.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(AuthorizationController.class.getName()).log(Level.SEVERE, null, ex);
}
Thread.sleep(2000);
} catch (InterruptedException ex) {
Logger.getLogger(ThreadInpOut.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
public void sendLoginPassword() throws IOException {
output.writeObject(tmp.getLogPass());
output.flush();
}
public void sendMessage() throws IOException {
connection = new Socket("127.0.0.1", 1025);
output = new ObjectOutputStream(connection.getOutputStream());
String mes = "mes@" + tmp.getMassage() + "@" + tmp.getLog();
output.writeObject(mes);
output.flush();
System.out.println("sended " + mes);
}
}
класс ChatController:
package StartMain.View;
import StartMain.Client;
import StartMain.ThreadInpOut;
import java.io.IOException;
import java.util.Arrays;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import java.util.Timer;
import java.util.TimerTask;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
public class ChatController {
Temp tmp = new Temp();
ThreadInpOut th = new ThreadInpOut();
Client cl = new Client();
@FXML
private Button Send;
@FXML
private TextArea InputArea;
@FXML
private TextArea OutputArea;
@FXML
private TextArea UserArea;
@FXML
private TextField users;
@FXML
public void getMassage() throws IOException {
String massege = InputArea.getText();
System.out.println("massege = " + massege);
tmp.setMassage(massege);
th.sendMessage();
InputArea.clear();
}
@FXML
public void writeUsers() throws IOException {
String[] arr = cl.getListLogin();
int i = 0;
while (i < arr.length) {
System.out.println("arr " + i + arr[i]);
UserArea.appendText(arr[i]);
i++;
}
}
}
В Java принято называть переменный с маленькой буквы.
У вас просто переменная UserArea не проинициализирована и поэтому возникает NPE. Вы создаете объект ChatController, но FXMLLoader не вызываете и все поля (@FXML) у вас инициализированы null.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости