2010-09-09 2 views
1

Я чувствую головоломку ...Поймать исключение, наконец, {}? Должен?

Я пишу небольшую рутину в .jsp. Наконец, должны быть закрыты ResultSet, Statement и Connection. Я также пишу коды закрытия в finally { }, но когда страница запущена, она возвращает ошибку, что я не поймал исключение ...

Я прочитал некоторый форум. Другие люди не обнаружили никаких исключений в finally { }

Подсказка?

+4

Исключение? Код? Bueller? –

+0

Кажется, вы использовали 'finally' без' try catch'. Пожалуйста, разместите свой фрагмент кода здесь –

+0

@Rakesh Juyal: поддерживает ли java «наконец» без «попытки»? :) – snemarch

ответ

0

Это помогает, если вы говорите, что находится в вашем блоке try. Вероятно, вы не поймаете соответствующее исключение, или ваш код в итоге исключает исключение.

Это нормально, наконец, без улова.

try { 
//do some work 
} 

finally { 
//check of state and do clean up. You would have reached here via multiple branches. 
} 

Более уместно уловить определенные исключения, используя улов, а затем обрабатывать определенную очистку там. Используйте, наконец, любой код, который должен выполняться даже в случае возникновения исключения.

try { 
    //do some work 
} 
catch (RecoverableException1 re1) { 
    //cleanup 
} 
catch (RecoverableException2 re2) { 
    //cleanup 
} 

finally { 
    //check of state and do clean up. You would have reached here via multiple branches. 
} 
2

finally {} не занимается исключением. Существует, наконец, {} блок, чтобы убедиться, что определенный код запущен, независимо от того, достиг ли блок try {} его естественный конец или временно ли он прыгает в finally {}, потому что произошло исключение, и что, наконец, {} блок находился вдоль путь. Но после окончательного {} завершения, исключение идет о его веселом бизнесе, пересекая его вверх по стеку и весело разбивая вашу программу.

Если вы хотите на самом деле поймать исключение и остановить его от разматывания стека, используйте catch() {}. Но не используйте catch, слепое исключение, которое вы на самом деле не знаете, как восстановить, намного хуже, чем сбой, потому что теперь ваша программа работает некорректно, и у вас нет трассы стека исключений, объясняющей почему.

Ваш результат, заявление и соединение почти наверняка закрылись. И тогда исключение продолжилось и все равно разбило вашу программу, потому что это не имело никакого отношения к вашим ResultSet, Statement и Connection.

Какое фактическое исключение?

3

Вы должны поймать исключения в коде finally. Как вы должны поймать исключения в блоке catch. Вложенные try/catch es - обычная вещь (хотя и уродливая).

Важным примечанием здесь является то, что вы могли бы иметь исключения, которые произошли, наконец, объявленные в предложении throws метода. Однако это приведет к исключению, в конечном итоге, заменяя исходное исключение, которое теряется. И вы увидите, например, NullPointerException, а не FileNotFoundException.

Кстати, избегайте использования кода в JSP-файле. Поместите его в сервлет.

2

Может быть, я старею, но что не так с улавливанием исключений в блоке catch?

3

Похоже, что у вас есть старая проблема, связанная с необходимостью закрыть() в блоке finally, но close() выдает исключение. Попробуйте что-нибудь вроде следующего ...

ResultSet rs; 

try { 
    // do various stuff 
    rs = ...; 

} finally { 
    try { 
     if (rs != null) rs.close(); 

    } catch (SQLException e) { 
     // do something with exception 
    } 
} 
-1

наконец { попробовать { resultSet.close(); } catch (E e) { } наконец { try { statement.close(); } catch (E e) { } наконец { conn.close(); }}

}

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