2013-04-30 16 views
1

我寫了一個客戶端,它在主線程的單獨線程中使用ObjectInputStream來讀取TCP消息。我使用Eclipse和雖然沒有例外,在控制檯拋出,在隨機時間調試窗口將打開,並顯示以下錯誤在什麼我以爲是線程堆棧跟蹤:objectinputstream.readobject()line:not available [局部變量不可用]

Thread[Thread-5](Suspended (exception ThreadDeath)) 
    objectinputstream.readobject() line: not available [local variables unavailable] 
    ReceiveRunnable.run()line:25 
    Thread.run()line:not available 

此代碼是例外點:

class ReceiveRunnable implements Runnable { 
    Object receivedObject; 

    public void run() { 
    while (true) { 
     try {    
     receivedObject = client.objectInStream.readObject(); //line 25 
     } catch (IOException e) { 
     // client.reconnectToServer(); 

     // System.out.println("IO exception in run()"); 
    // System.out.println(e); 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
    System.out.println("Class Not Found exception in run()"); 
     System.out.println(e); 
    e.printStackTrace(); 
     } catch (Exception e) { 
    System.out.println("Exception in ReceiveRunnable.run()"); 
     System.out.println(e.toString()); 
    e.printStackTrace(); 
     } 
    } 
    } 
} 

client.objectInStreamClient類創建:

void connectToServer(){ 
    try { 
     connected = false; 

     socket = new Socket(host, port); 

     System.out.println("<Connected> " + socket); 

     objectInStream = new ObjectInputStream(socket.getInputStream()); 

     objectOutStream = new ObjectOutputStream(socket.getOutputStream()); 

     receiveThread = new Thread(new ReceiveRunnable(this, "receive")); 

     receiveThread.start(); 

     /* used to periodically ping the server*/ 
     long delay = 0; 
     long period = 5000; 

     connTimer.schedule(clientCheckConnTimerTask, delay, period); 

     connected = true; 

     sendString("[conn]" + clientUUID); 
    } catch (IOException e) { 
     msgBox.set2LineOkMessage("Can not connect to server.", ""); 
     msgBox.show(); 
    } 
} 

誰能告訴我什麼是causi請問這個問題以及我如何解決問題?

回答

1

如果try後面沒有跟着關閉套接字並跳出循環的catch (EOFException exc),那麼您的代碼不正確。

你應該總是在ObjectInputStream之前爲同一套接字創建ObjectOutputStream,而不是之後,否則可能會發生死鎖。

+0

我已經添加了例外,我趕上我的例子(遺憾的縮進,由於某種原因,它不正確解析)。 'IOException'捕獲到'EOFException'。另外我交換了創建ObjectOutputStream和ObjectInputStream的順序,雖然我不認爲這是導致加載時間加快的問題的原因,謝謝。 – 2013-04-30 01:57:25

+0

我已經讓我的應用程序運行了幾個小時,您的解決方案似乎解決了我的問題。我不明白爲什麼創建對象流的順序應該很重要。你能解釋它爲什麼這樣做嗎? – 2013-04-30 19:44:34

+0

查看Javadoc。 ObjectOutputStream的構造函數寫入一個由ObjectInputStream構造函數讀取的頭文件。如果您在兩端首先創建輸入流,則無法讀取,因此雙方都會死鎖。如果任何一方首先創建輸出流,則不會發生。如果雙方首先創建輸出流,則無論對方做什麼都不會發生。 – EJP 2013-05-03 03:54:46