Получение NullPointerException, когда я пытаюсь записать объект на сервер в Java

1

У меня небольшая проблема. Я пытаюсь использовать метод в другом классе для отправки объекта на сервер, который у меня есть. Я использую Java с сокетами.

Метод:

public void sendMessageToServer(String message) {

    if (message != null) {
        try {
            serverComManager.outputStream.writeObject(message);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Класс пытается использовать метод:

        sendMessage.sendMessageToServer("Hello");

Ошибка выводится на строку:

    serverComManager.outputStream.writeObject(message);

Заранее спасибо! ~ Rane

EDIT: по запросу я добавил объявление serverComManager, а также код для этого класса. Я также включил полную ошибку. Надеюсь, это поможет вам понять мою проблему.

Декларация:

    ServerCommunicationManager serverComManager = new ServerCommunicationManager();

Код для ServerCommunicationManager:

boolean connected;


//Setup
Socket clientSocket;
ObjectOutputStream outputStream;
ObjectInputStream inputStream;

public boolean connectToHost() throws UnknownHostException, IOException{


    clientSocket = new Socket("localhost", 2444);
    setupStreams(clientSocket);

    if(clientSocket.isConnected()){
        connected = true;
    }else{
        connected = false;
    }


    return connected;

}

private void setupStreams(Socket s) throws IOException{

    outputStream = new ObjectOutputStream(s.getOutputStream());
    inputStream = new ObjectInputStream(s.getInputStream());

}

Ошибка:

Exception java.lang.NullPointerException
at SendToServer.sendMessageToServer(SendToServer.java:16)
at DissconnectClient.dissconnectFromServer(DissconnectClient.java:15)

Строки ошибок:

DissconnectClient 15: sendMessage.sendMessageToServer(abortConnectionKeyword);
SendToServer 16: serverComManager.outputStream.writeObject(message);

ПРИМЕЧАНИЕ. DisconnectClient - один из классов, с которыми я пишу. Вот код класса:

    public class DissconnectClient {

    //Variables
    private final String keyword = "DISSCONNECT";


    //Setup
    SendToServer sendMessage = new SendToServer();


    public void dissconnectFromServer(){

        sendMessage.sendMessageToServer(keyword);

    }

}
  • 1
    Можете ли вы опубликовать исключение или большую часть трассировки стека, пожалуйста. Поскольку может быть много способов выдать это исключение, ваше соединение может быть не открыто, или serverComManager имеет значение null, или что-то еще.
  • 0
    Где вы назначаете переменную serverComManager?
Теги:
nullpointerexception
serversocket

1 ответ

1
Лучший ответ

Я не вижу, где вы назначаете значение "serverComManager" или где вы создаете isntance этого. Возможно, в методе конструктора класса, который имеет метод "sendMessageToServer", вы делаете что-то вроде this.serverComManager = (...). Я не уверен, как вы обрабатываете логику "serverComManager", но до сих пор мой подход к решению проблемы был следующим (если я пишу клиент, который отправляет сообщение на сервер). И учитывая, что для вашего "serverConnManager" не предусмотрен код, возможно, вы могли бы идентифицировать что-то, отсутствующее в вашей текущей реализации.

public void sendMessageToServer(String message) {

    if (message != null) {
        try {
            //Assume I already have an instance of client Socket:
            //Socket outgoingConn = new Socket(host, port)
            //1. I get the OutputStream of my outgoing connection
            OutputStream outStream = outgoingConn.getOutputStream();
            //2. Create an object output stream
            ObjectOutputStream objectWriter = new ObjectOutputStream(outStream);
            //3. Write the object
            objectWriter.writeObject(message);
            //Close the io if required (would recommend try-with-resources if using jdk7)
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Если вы работаете только со строковыми сообщениями, BufferedWriter orBufferedReadr будет достаточно, если вы попытаетесь обработать сложные объекты, которые могут быть как "beans", так и Strings, лучше, если вы создадите что-то вроде:

public class MessageBean implements Serializable {
    private MessageType type;
    private Object param;
    //Getters/Setters
}

MessageType может быть перечислением, указывающим тип поддерживаемых объектов, поскольку поле param - это объект, который вы можете обрабатывать как String или как bean-компонент. Затем работайте на основе MessageType или с помощью "instanceof". Но, это всего лишь предложение, если вы хотите попробовать что-то еще.

Надеюсь, поможет. Счастливое кодирование!

С уважением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню