2013-04-02 11 views
37

Блок «finally» всегда выполняется, когда конец try-catch заканчивается, либо в случае исключения, либо нет. Но также всегда выполняется каждая строка кода снаружи и после try-catch. Итак, почему я должен использовать утверждение finally?Какая польза от использования «finally» после блока try-catch в java?

Пример:

try { 
    //code... 
} catch (Exception e) { 
    //code... 
} finally { 
    System.out.println("This line is always printed"); 
} 
System.out.println("Also this line is always printed !! So why to use 'finally'?? "); 
+0

Я должен был использовать – Aarath

+0

С уловом (Throwable t) вместо catch (Exception e) всегда будет выполняться последняя строка. – Aarath

+1

Это частый шаблон, который бросает новые исключения в блоки catch и, наконец, позволяет вам очищать вещи от блока try перед отправкой нового исключения. Это очень удобно. Обозначение также делает код более смысловым. –

ответ

21

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

InputStream is = ... 
try { 
    //code... 
} catch (Exception e) { 
    //code... 
} finally { 
    is.close(); 
} 

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

long startTime = System.currentTimeMillis(); 
try { 
    //code... 
} catch (Exception e) { 
    //code... 
} finally { 
    long endTime = System.currentTimeMillis(); 
    System.out.println("Operation took " + (endTime-startTime) + " ms"); 
} 

Идея этого finally блока всегда выполняются в том, что это не относится к первой строке после всего блока

  • если catch блока позволяет некоторому метательный проход
  • если он rethrows себя исключение, которое очень часто
-2

окончательная цель блока - закрыть ресурсы, которые вы открыли внутри блока try. ресурсов может быть что угодно, как соединения с базой данных, запись файла/чтение и т.д.:

Connection conn= null; 
try { 
conn= get the db conn; 
//do some DML/DDL 
} 
catch(SQLException ex) { 

} 
finally { 
conn.close(); 
} 
-1

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

4

, но и каждую строку кода снаружи и после примерки улова всегда выполняется

Это неправильно. В случае исключенных исключений (RuntimeException, Error и их подклассы) код после finally не будет выполняться.

Взгляните на этот код

public static void main(String[] args) { 
    try{ 
     someDengerousMethod(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }finally{ 
     System.out.println("finally block"); 
    } 
    System.out.println("after finally..."); 
} 
public static void someDengerousMethod(){ 
    throw new Error("something went wrong"); 
} 
+0

Пример кода в вопросе Аарата поймал бы RuntimeException. В этом случае также будет запущен код после блока finally. – jarnbjo

+0

@jarnbjo Затем вместо программы «RuntimeException» можно сбросить «Ошибка», которая также не установлена. Теперь вы, вероятно, скажете, что его можно обработать, поймав «Throwable», но насколько реально работают настоящие программы? Если мы начнем ловить все ошибки, нам действительно не понадобится раздел 'finally', потому что мы можем переместить его в конце каждого блока catch и после раздела try-catch в случае, если никакой улов не был выполнен. – Pshemo

+0

Ваша проблема в том, что вы пытаетесь объяснить общее поведение, используя очень узкое объяснение, которое охватывает только очень специфическую причину. Существует несколько ситуаций, когда выполнение кода не будет продолжаться после блока finally, например. если какое-либо исключение выбрано в блоке try и не поймано с соответствующим блоком catch (это совершенно не имеет значения, если это время выполнения или неконтролируемое исключение), если новое исключение выбрано в блоке catch или если выполнение кода прервано любым другое заявление, например оператор return в блоке try. – jarnbjo

0

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

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

Больше here

6

Последнее System.out.println (после того, как окончательно блок) будет работать только если исключение брошено в блоке попробовать это actuaclly пойманы с фиксацией блока и, если исполнение не прерывается, например, оператор возврата.

В вашем примере блок finally всегда будет запущен, но выполнение будет продолжаться только после блока finally, если в блоке try не будет отправлено Error (оно не будет поймано), если Throwable не выбрано catch, и нет другого оператора, который прерывает выполнение.