Наконец, блоки позволяют вам, как разработчику, привести себя в порядок, независимо от действий предыдущего кода в блоке try {}, обнаруживших ошибки, и, как уже отмечали другие, это в основном попадает под зонтик освобождения. ресурсы - закрытие указателей / сокетов / наборов результатов, возврат соединений в пул и т. д.
@ mats очень правильно говорит о том, что всегда есть вероятность "серьезных" сбоев - наконец, блоки не должны включать критически важный код, который всегда должен выполняться транзакционно внутри try {}
@ mats again - настоящая красота в том, что он позволяет вам исключать исключения из ваших собственных методов, и при этом гарантирует, что вы приведете в порядок:
try
{
StreamReader stream = new StreamReader("foo.bar");
mySendSomethingToStream(stream);
}
catch(noSomethingToSendException e) {
//Swallow this
logger.error(e.getMessage());
}
catch(anotherTypeOfException e) {
//More serious, throw this one back
throw(e);
}
finally
{
stream.close();
}
Таким образом, мы можем перехватить много типов исключений, обработать их по-разному (первый позволяет выполнение для чего угодно, кроме try {}, второй эффективно возвращает), но всегда аккуратно и аккуратно очищается.