2013-02-21 63 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