NullPointerExeption при записи в textArea

257
18 апреля 2017, 07:54

Пишу простой чат на 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++;
        }
    }
}
Answer 1

В Java принято называть переменный с маленькой буквы.

У вас просто переменная UserArea не проинициализирована и поэтому возникает NPE. Вы создаете объект ChatController, но FXMLLoader не вызываете и все поля (@FXML) у вас инициализированы null.

READ ALSO
Не правильно по времени срабатывает alarmManager. Подскажите в чем ошибка, пожалуйста

Не правильно по времени срабатывает alarmManager. Подскажите в чем ошибка, пожалуйста

Проблема AlarmManager в том, что он НЕ гарантирует точного срабатывания в назначенное времяНа официальном сайте Android'a об этом написано - Alarm Manager

272
Встраивание API в андроид приложение [требует правки]

Встраивание API в андроид приложение [требует правки]

Нужно встроить api яндекс переводчика в мобильное приложение, на андроид начал программировать недавно, с API до этого не работал, поэтому уперся...

261
Помогите, не понимаю как использовать return в java

Помогите, не понимаю как использовать return в java

Вот вроде понимаю что return что-то возвращает, завершает процессы метода(функции), но что, как он это делает вообще не понимаюПересмотрел кучу...

315
Для чего необходимо вводить аннотацию @Entity при определение класса , Hibernate

Для чего необходимо вводить аннотацию @Entity при определение класса , Hibernate

Не совсем ясно в чем смысл этой аннотации когда есть @Table которая явно указывает с какой таблицей идет связь

250