2014-09-29 29 views
1

我遇到一个小问题。我试图在另一个类中使用一个方法来发送一个对象给我的服务器。我正在使用Java与套接字。当我尝试使用Java将对象写入服务器时发生NullPointerException

方法:

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

编辑:根据要求,我添加了'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是空的,或者其他的。 – Cold 2014-09-29 11:27:28

+0

你在哪里分配serverComManager变量? – 2014-09-29 11:27:57

回答

1

我看不到你在哪里分配“serverComManager”还是你创建一个这样的isntance其中的价值。也许在构造函数方法中,有类似“this.serverComManager =(...)”的类的方法是“sendMessageToServer”。我不知道你是如何处理“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就足够了,如果你尝试,如果你创造这样来处理复杂的对象既可以是“豆”或字符串,更好:

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

MessageType可能是一个枚举,指定支持的对象的类型,因为param字段是一个可以作为String或Bean处理的对象。然后基于MessageType或使用“instanceof”工作。但是,如果你想进一步尝试,这只是一个建议。

希望它有帮助。快乐的编码!

问候。

相关问题