2013-02-21 3 views
0

Итак, у меня есть поток для получения данных от клиента. Для чтения этих данных есть ObjectInputReader. Если ObjectInputReader не удалось инициализировать в моем try-catch, что произойдет, если клиент отключится без уведомления сервера, try-catch должен вызвать исключение.Исключение выбрано только в отладочной + точке останова

Итак, у меня есть обработка «Отключить клиент» в Catch-Statement. Но этого никогда не бывает.

Но если я запускаю сервер при отладке и устанавливаю точку останова в Catch-Statement, возникает исключение, и все обрабатывается, как я хочу. Но только с точкой останова, никогда не без (отладка или выпуск).

Я использую eclipse, я думаю, что самая новая версия.

Неужели кто-то когда-либо имел эту «ошибку»? Или я делаю что-то неправильно?

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

Ну, есть некоторые проблемы, которые я только что понял: В то время как (true) запускает цикл for и проверяет listSockets.size(), который равен 0. На этом этапе клиент соединяется и размер увеличивается. Но цикл while и check не получают уведомления о том, что размер увеличивается, поэтому между этими командами существует бесконечный цикл. Если я проверяю размер с помощью оператора if и sysout размером до начала, все работает. – Loki

+0

Вы все еще видите другое поведение между тем, когда у вас есть точка останова, а когда нет? –

ответ

0

Всегда помните, что отладка может повлиять на вашу программу. Особенно, когда вы проверяете переменные, jvm вызывает вызовы методов toString(). Если один метод toString() изменяет состояние одного из ваших объектов, результат изменится. Попробуйте что-то вроде

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

, чтобы увидеть, если программа действительно прыгает в блок поймать или метод disconnectClient имеет недостаток. Если вы добавите еще несколько System.out. Вы могли видеть, что программа остановилась.

+0

С этим« я здесь »syso ничего не происходит при запуске в выпуске или отладке. Но при запуске с точкой останова выдается исключение. Так что это как без этого утверждения. – Loki

+0

хорошо либо их асинхронная ошибка в вашем коде (как упоминала Патрисия Шанахан в своем комментарии), либо вы обнаружили ошибку java. Вы можете попробовать этот код на другой версии Java, чтобы быть уверенным (хотя вам может потребоваться изменить часть вашего кода, если вы хотите запустить его в java 6 или 5) –

Смежные вопросы