Можем ли мы избежать блокировки наконец, если мы выполним очистку ресурсов в обеих попытках и поймать вместе? - PullRequest
0 голосов
/ 26 ноября 2018

Можем ли мы избежать блокировки наконец, если мы выполним очистку ресурса в и попробуем поймать вместе ?

Например, можем ли мы сделать что-то подобное и не использовать окончательно?

try{
 // Some statements
 db.close();
}catch(Exception e){
 db.close();
}

Будет ли он работать как положено?Если Да , то почему мы должны или не должны его использовать?

Ответы [ 5 ]

0 голосов
/ 26 ноября 2018

По возможности используйте try-with-resources или try-finally (try-catch-finally).

Можем ли мы избежать блокировки finally, если мы выполняем очистку ресурсов одновременно в попытках и перехвате?

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

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

Не работает:

  • ваше соединение не всегда закрыто, так как вы обрабатываете только исключения, никаких ошибок или перебрасываний

Некоторыеantipatterns:

  • Вы заново изобретаете колесо
  • DRY (не повторяйте себя)
  • Сначала поймайте наиболее конкретные исключения;избегайте обработки Exception, Error или Throwable в общем
  • помните о глотании исключений (возможно, наконец, тоже!), try-with-resources использует подавленные исключения для этого
  • ...
0 голосов
/ 26 ноября 2018

Да, это будет работать.Наконец, блок в основном используется для общих операций в try / catch .Но подумайте, у вас есть 10-20 общих утверждений как в попытке, так и в ловле.Тогда как это будет выглядеть?Наконец, блок поможет вам удалить избыточность вашего кода.

0 голосов
/ 26 ноября 2018

Просто используйте try-with-resources:

try(Connection db = getConnection()){
    //perform stuff
}

как только блок try завершит обработку, Connection будет закрыт.

0 голосов
/ 26 ноября 2018

Это работает, как и ожидалось, однако повторяет код, что означает, что если вы хотите изменить «окончательный код детали», вам придется менять код дважды, а не один раз, если вы поместите его в блок finally.

0 голосов
/ 26 ноября 2018

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

Для получения наилучших практических методов см. Этот вопрос Передовые практики Java try / catch / finally при получении /закрытие ресурсов

...