2013-07-31 3 views
8

Это то, что я пытаюсь сделать:Java - Если я вернусь в блок catch, будет ли выполнен блок finally?

try { 

    //code 
} catch (Exception e) { 

    return false; 
} finally { 

    //close resources 
} 

Будет ли это работать? Это плохая практика? Было бы лучше сделать это:

boolean inserted = true; 

try { 

    //code 
} catch (Exception e) { 

    inserted = false; 
} finally { 

    //close resources 
} 

return inserted; 
+6

попробовал? – Ankit

+0

dup alert! Вы пытались выполнить поиск? это было задано несколько раз ... – devnull

+0

@devnull Я исследовал, но я не был уверен, было ли это хорошо. Некоторые темы говорили, что все в порядке, в то время как другие говорили, что это не очень хорошо. –

ответ

20

Да, это будет. Единственное, что может предотвратить выполнение блока finally (AFAIR), - это System.exit() и бесконечный цикл (и, конечно же, сбой JVM).

+7

... и перебой в электропитании :) (взрыв, вы разрушили его с добавлением аварии JVM) – ppeterka

+0

Но является ли мой первый пример плохой практикой? –

+2

Интересный бит, которого многие игнорируют, заключается в том, что 'Thread # stop' будет * not * предотвращать выполнение' finally'. –

5

finally блок выполнен всегда, безоговорочно, как последнее, что try-catch-finally блок делает. Даже если вы выполните против него Thread#stop, блок finally будет выполняться, как если бы возникло обычное исключение.

Не только это, если вы вернетесь с finally, это возвращаемое значение попирает возврат из try или catch.

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

+1

im не согласен с '..btw' частью, я думаю, что лучше иметь только один оператор return, но это позволяет мне узнать об этом здесь (откуда взялось понятие одного возврата) [http: // программисты. stackexchange.com/questions/118703/where-did-the-notion-of-one-return-only-come-from] – nachokk

+1

Это хорошая запись! (первый ответ) –

4

Оба являются примерно одинаковыми. Однако, будьте осторожны с следующим случаем:

int i = 0; 

try 
{ 
    //code 
} 
catch(Exception e) 
{ 
    return i; 
} 
finally 
{ 
    i = 1; 
} 

0 что будет возвращено.

+0

Тогда я думаю, что мой пример не является хорошей практикой, верно? –

+0

@ Thecoolguyacrossthestreet Лучшая практика - использовать чистый код, когда это возможно. –

0

Я просто хотел бы добавить, что это описано в the specs:

Если блок задвижки завершается преждевременно по причине R, то в конце концов блока.

где конечно

Это можно увидеть, то, что оператор возврата всегда завершается преждевременно.

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