2013-02-21 64 views
0

所以我有一個線程來接收來自客戶端的數據。有一個ObjectInputReader來讀取這個數據。如果ObjectInputReader無法在我的try-catch中初始化,如果客戶端斷開而不通知服務器會發生什麼情況,try-catch應該調用異常。異常只在調試+斷點

所以我有我的「斷開客戶端」處理在Catch語句。但它從未發生過。

但是,如果我在調試時運行服務器並在Catch-Statement中設置了一個斷點,那麼發生異常並且所有事情都按照我想要的那樣進行處理。但只有斷點,從來沒有(調試或釋放)。

我正在使用eclipse,我想最新的版本。

有人曾經碰巧有這個「bug」嗎?或者我做錯了什麼?

private static Runnable receive = new Runnable(){ 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     ObjectInputStream ois; 

     while(true) 
     { 
      for(int i = 0; i < listSockets.size();i++){ 
       try { 
        ois = new ObjectInputStream(listSockets.get(i).getInputStream()); 
        int receiveState = (Integer)ois.readObject(); 

        DataPackage dp = (DataPackage)ois.readObject(); 

        listData.set(i,dp); 

        if(receiveState == 1){ //client disconnected by user 
         disconnectClient(i); 
         i--; 
        } 

        ois.close(); 
       } catch (IOException | ClassNotFoundException e) { 
        disconnectClient(i); 
        i--; 
       } 

      } 
     } 
    } 


}; 
+0

當你沒有斷點的時候會發生什麼,循環是否會永久循環? – 2013-02-21 10:37:29

+0

嗯,我剛剛發現了一些問題: while(true)啓動for循環並檢查爲0的listSockets.size()。此時,客戶端連接並且大小增加。但while循環和檢查沒有得到通知,增加的大小,所以這些命令之間有一個無限循環。如果我在for之前檢查if語句和sysout的大小,一切正常。 – Loki 2013-02-21 11:02:33

+0

當你有斷點時,你仍然看到不同的行爲? – 2013-02-21 11:08:54

回答

0

總而言之,調試可能會影響您的程序。特別是當你檢查變量時,jvm會導致很多toString()方法被調用。如果一個toString()方法改變了你的一個對象的狀態,結果會改變。試試像

} catch (IOException | ClassNotFoundException e) { 
     System.out.println("I am here"); 
     disconnectClient(i); 
     i--; 
} 

看看程序是否真的跳入catch塊或disconnectClient方法有缺陷。如果你添加更多的System.out。您可能會看到Programm停止。

+0

在這個「我在這裏」時,syso在發佈或調試時沒有任何變化。但是,在運行斷點時引發異常。所以這就像沒有這個說法。 – Loki 2013-02-21 10:27:07

+0

或者它們在你的代碼中是一個異步錯誤(就像Patricia Shanahan在她的評論中提到的那樣),或者你發現了一個java錯誤。你可以在另一個java版本上嘗試這段代碼(儘管如果你想在java 6或5中運行它,你可能需要更改一些代碼) – 2013-02-22 08:51:04