2013-02-21 2 views
0

에서만 발생합니다. 따라서 클라이언트로부터 데이터 받기에 대한 스레드가 있습니다. 이 Data를 읽는 ObjectInputReader가 있습니다. 내 try-catch에서 ObjectInputReader를 초기화 할 수없는 경우 클라이언트가 서버에 알리지 않고 연결을 끊으면 try-catch가 예외를 호출해야합니다.예외는 디버그 + 중단 점

그래서 Catch-Statement에서 "클라이언트 연결 끊기"처리가 있습니다. 그러나 결코 일어나지 않습니다.

그러나 서버를 디버그로 실행하고 Catch-Statement에 중단 점을 설정하면 예외가 발생하고 원하는대로 처리됩니다. 그러나 브레이크 포인트 만 있으면 (디버그 또는 릴리스하지 않고).

나는 이클립스를 사용하고 있는데, 나는 최신 버전이라고 생각한다.

누군가이 "버그"가 발생 했습니까? 아니면 내가 잘못하고있는거야?

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

중단 점이 없을 때 어떻게됩니까? 루프가 영원히 반복됩니까? –

+0

잘 알고있는 문제가 있습니다. while (true)는 for 루프를 시작하고 listSockets.size()가 0인지 확인합니다.이 시점에서 클라이언트가 연결되고 크기가 커집니다. 그러나 while-loop와 check는 크기가 커지므로이 명령들 사이에 무한 루프가 있음을 알리지 않습니다. if 문과 sysout 크기를 확인하기 전에 for가 사용하면 모든 것이 작동합니다. – Loki

+0

중단 점이있을 때와 그렇지 않을 때 여전히 다른 동작이 나타 납니까? –

답변

0

디버깅이 프로그램에 영향을 줄 수 있습니다. 특히 변수를 검사 할 때 jvm은 많은 toString() 메서드를 호출합니다. 하나의 toString() 메서드가 객체 중 하나의 상태를 변경하면 결과가 변경됩니다.

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

과 같이 시도하십시오. 프로그램이 실제로 catch 블록으로 점프하는지 또는 disconnectClient 메소드에 결함이 있는지 확인하십시오. 몇 가지 System.out을 추가하면됩니다. Programm이 멈춘 것을 볼 수 있습니다.

+0

릴리스 나 디버깅에서 실행될 때 "나는 여기 있습니다"라는 메시지가 나타나지 않습니다. 그러나 브레이크 포인트로 실행할 때 예외가 발생합니다. 그래서 그것은이 진술이없는 것과 같습니다. – Loki

+0

잘 자신의 코드에서 비동기 버그 (Patricia Shanahan이 언급 한대로) 또는 자바 버그를 발견했습니다. 다른 Java 버전에서이 코드를 시도해 볼 수도 있습니다 (Java 6 또는 5에서 실행하려면 코드를 변경해야 할 수도 있음) –

관련 문제