2013-06-23 3 views
8

В чем разница между «finally» и write после «catch»?Разница между окончанием и записью после улова

Например:

public boolean example() { 
    try { 
     // Code 
    } catch (RuntimeException e) { 
     // Code 
    } finally { 
     return true; 
    } 
} 

public boolean example() { 
    try { 
     // Code 
    } catch (RuntimeException e) { 
     // Code 
    } 
    return true; 
} 
+0

Вы можете добавить логику, чтобы закрыть ресурсы в выражении блока 'finally' и получить здесь исключение, поэтому лучшей альтернативой будет последняя (IMO). –

+0

нет разницы в вашем примере. Сделайте некоторую очистку, в конце концов, которая будет выполнена в любом случае. – Tala

ответ

2

Нет разницы в вашем случае. но

Система выполнения всегда выполняет операторы в пределах finally block независимо от того, что происходит в блоке try.

Так что это идеальное место для проведения уборки.

Обратите внимание, что если вы используете JDK 7+, то большинство использования блока finally можно устранить, просто используя try-with-resources statement.

3

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

Интересный момент, чтобы сделать здесь, мы должны избегать возврата из блока finally, потому что он может создавать путаницу в сценарии, когда мы возвращаем что-то из блока try. Рассмотрим этот фрагмент кода:

try { 
    return true; 
} 
finally { 
    return false; 
} 

Теперь этот код вернет false независимо от того, что происходит при попытке. Во многом это поведение в точности согласуется с разговорной концепцией того, что в конечном итоге означает - «независимо от того, что происходит заранее в блоке try, всегда запускайте этот код». Следовательно, если вы вернете истину из блока finally, общий эффект должен всегда состоять в том, чтобы вернуть true, no?

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

+0

Если окончательно завершается внезапно, возвращаясь или бросая исключение, любое предыдущее возвращение вызова функции игнорируется. Это означает, что, наконец, проглотит любое исключение или обычное возвращаемое значение, если оно выдает исключение или вы используете возврат. Как указано, только окончательно используйте для очистки ресурсов, и имейте в виду, что если вы в конце концов вызовете вызовы, которые могут вызвать исключение, вы должны обернуть их в try-catch, чтобы избежать проглатывания других исключений. Если вы используете try-with-resources, вы можете получить проглоченное исключение с Throwable.getSuppressed() –

-2

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

+2

Это просто неправильно. Код выполняется после try-catch. –

4

Первый всего лишь идиомы, что даже можно считать кандидата это:

try { 
    // stuff 
} catch (Throwable t) { /* handle */ } 
// finally stuff 

Примечания пойманного типа. Только если вы поймаете любое возможное исключение, в том числе такие темные монстры, как ThreadDeath и VirtualMachineError, можете ли вы надеяться безоговорочно достичь кода под try-catch.

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

try { /* main stuff */ } 
catch (Throwable t) { 
    try { /* handle */ } catch (Throwable t) { 
    // no code allowed here! Otherwise we descend into infinite recursion 
    } 
} 
/* finally stuff */ 

Теперь вы можете начинают понимать преимущества finally, но это еще не все. Рассмотрим довольно типичный сценарий:

try { 
    /* main stuff, may throw an exception. I want the exception to 
    break what I'm doing here and propagate to the caller */ 
    return true; 
} finally { /* clean up, even if about to propagate the exception */ } 

Как вы это переписываете? Без дублирования кода невозможно.

0

Первое, что нужно понять в этом вопросе, - «почему мы используем try {} catch {} block« Ok.

Ответ на вопрос, когда есть возможность нашего кода исключения.

Этот код, который мы помещаем в try {...} block & catch {...} блок содержит код, чтобы поймать исключение, сгенерированное кодом в try {} block.

Наконец, {...} блок содержит код, выполняемый сразу после try {} catch {} block, когда try {} block выдает исключение.

e.g Когда вы посещаете какой-либо веб-сайт, но делаете с какой-либо проблемой на стороне сервера, он не может и на странице отображать какое-то сообщение, например «ошибка 404 или сервер обновляется», этот код написан в блоке finally.

0

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

1

Мы используем блок try, catch block и, наконец, блокируем обработку Exception в нашей программе. В программе может быть проверка или снятие исключения. поэтому этот блок используется для обработки этого Исключения. В блоке try мы упоминаем или записываем тот код, который может быть причиной исключения, и если мы хотим, чтобы наш код выполнялся, если возникло исключение. Затем мы записываем этот код в блок catch. наконец, является очень специальным блоком, который дает нам особую особенность, которая, если наш блок catch не запускается, прежде чем программа закончится, чтобы окончательно выполнить код блока. в основном это использование, чтобы сохранить наши данные во время нежелательной остановки программы. если мы используем блок try, тогда после блока try должен быть блок catch, но, наконец, необязательный необязательный.

0

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

например:

File f = new File("\file.txt"); 
    FileStream fs; 
    try{ 
     fs = new FileStream(f); 
    } catch (IOException ioe){ 
     ioe.printStackTrace(); 
    } finally { 
     if (fs != null) { 
     fs.close() // close the stream 
     } 
    } 
0

Как ваш код только возвращающегося true/false, поэтому он не будет влиять на многое. Но подумайте о любом другом коде/логике, где какой-то обязательный/очищающий код записывается для выполнения.

Кроме того, нам будет сложно поймать все исключения через наш код или, другими словами, мы должны поймать определенные исключения, которые мы можем обработать. В этот момент finally будет настоящим спасителем, так как он всегда будет выполняться (кроме System.exit() или в каком-то рекурсивном случае).

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

Вы можете передать ниже сообщения тоже за дополнительные пояснения:

0

Первый случай:

Если исключение произошло в TRY Бло ck, тогда будет выполняться блок catch, и при обслуживании одного и того же блока catch, если снова произойдет исключение, тогда будет выполнен блок finally.

Второй случай:

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