2014-09-29 61 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」工作。但是,如果你想進一步嘗試,這只是一個建議。

希望它有幫助。快樂的編碼!

問候。

相關問題