Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как вернуться в цикл после исключения


Автор: koreyko 12.12.2011, 18:05
Здравствуйте! Помогите решать задачу:

Приложение по таймеру обращается к серверу, получает новые данные и записывает их во внешний файл. Бывает ситуация, когда с внешним файлом работает другая программа. В этом случае необходимо с заданной периодичностью пытаться записать данные.

Сделал так:

Код

// метод класса-наследника SwingWorker
protected void done(){
    int result = 0; // возвращаемое значение saveData
        tryCount = 0; // количество попыток записи в файл
            
    do    {
        result = saveData(file);
                
        if(tryCount > attemptsCount)
            break;
        if(tryCount > 0){
            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {                    
                e.printStackTrace(); 
                        }
        }
        tryCount++;
                
    }     while(result!=1);
}
 

В случае недоступности файла, куда необходимо записать данные, я, естественно, получаю исключение FileNotFoundException, которое прерывает цикл. 

Мне же необходимо, чтобы попытки записи продолжались, несмотря на исключения.
Спасибо.

Автор: LSD 12.12.2011, 18:29
Окружи saveData() try/catch блоком.

Автор: koreyko 12.12.2011, 23:01
Спасибо, помогло!

Остался вопрос по приведенному мной выше коду. На время работы цикла GUI перестает реагировать на действия пользователя. Насколько я понимаю, проблема в этом:

Код

    Thread.sleep(sleepTime);

однако не разобрался - этот Thread останавливает текущий поток (т.е. SwingWorker) или какой-то другой? Другими словами, мне поможет уход от SwingWorker к чему-то другому или же Thread.sleep(sleepTime) здесь в любом случае не стоит применять?
Спасибо.


Автор: Mirkes 13.12.2011, 03:01
Вопрос с задержками обсуждался многократно. Посмотрите на форуме. В кратце. Если Ваш цикл выполняется в EDT (в потоке событий) то sleep применять не стоит, поскольку он всегда будет останавливать GUI. события таймера swing идут в потоке событий.

Автор: Skipy 13.12.2011, 12:56
Цитата(koreyko @ 12.12.2011,  23:01)
Остался вопрос по приведенному мной выше коду. На время работы цикла GUI перестает реагировать на действия пользователя.

http://www.skipy.ru/technics/gui_sync.html

Автор: koreyko 16.12.2011, 12:25
Всем спасибо, вроде бы разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)