2013-08-13 2 views
0

У меня есть примерки всеобъемлющая наконец блок, который выглядит так:Что заставляет блок finally выполнить слишком скоро?

ResultSet rs; 
PreparedStatement ps; 
Connection conn; 
try { 
    for (int i = 0; i < list.size(); i++) { 
     ** execute SQL query ** 
    } 
} catch (Exception e) { 
    throw e; 
} finally { 
    ** close result set ** 
    ** close prepared statement ** 
    ** close connection ** 
} 

Я проверил, что мой список ArrayList имел 534 элементов в нем. Проблема в том, что блок finally для закрытия всего выполняется после первого вхождения цикла for for, что приводит к тому, что следующее возникновение вызывает исключение, потому что соединение теперь закрыто.

Я никогда не сталкивался с ситуацией, когда блок finally выполняется до завершения блока try. Что может вызвать этот сценарий?

+3

могли бы включить больше вашего исходного кода? Обфускание самого запроса, если хотите. Но больший контекст поможет. – jtravaglini

+4

Может ли быть, что ваша первая итерация выдает исключение? Это объяснит это. – Konstantin

+1

Возможно, вы повторно используете объект, не подлежащий повторному использованию. – SLaks

ответ

0

Без дополнительного источника я бы предположил, что вы не совершаете транзакции.

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

См. here для обсуждения.

2

В основном, происходит то, что finally работает должным образом. Краткое объяснение заключается в том, что выполняется finally блок независимо от того, какtry блок завершается.

В вашем примере, и на основе того, что вы сказали, наиболее вероятный сценарий развития событий выглядит следующим образом:

  • тело цикла проливает исключение,
  • исключение перехватывается и вызваны повторно, и
  • Затем выполняется
  • блок finally.

finally блок НЕ будет выполняться до try блока «Завершает», так что ваша теория, что finally блок вызывает тело цикла сбой не является правильным.

Ссылка: http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

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