2015-10-04 3 views
2

Так что я знаю, что блок кода finally будет выполняться независимо от исключения, но неужели его не использовать? Я использовал только try/catch и хотел знать, была ли это плохой практикой. Или это не имеет большого значения?Является ли попытка/поймать, наконец, плохо

+0

Каково использование 'finally'? –

+0

Java-документ отвечает на ваш вопрос! – Shriram

+0

@OliverCharlesworth код в блоке finally будет выполняться независимо от того, возникла ли у вас ошибка с ошибкой или нет, если вы написали код после блока catch без использования, наконец, он не будет выполняться, если было отправлено исключение – trevalexandro

ответ

6

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

+0

Вот что я думал. Я объявлял/открывал соединение в блоке try и хотел закрыть его в конце, но область действия переменной подключения не позволяла этому случиться. Я решил, что смогу закрыть его и в попытке, поэтому я задал этот вопрос. – trevalexandro

+0

Но ваша переменная соединения не объявлена ​​вне блока try? Объявление и закрытие переменной соединения в блоке try небезопасно, потому что если между попыткой инициализации соединения и временем его закрытия в попытке создается исключение, соединение будет оставаться открытым! Что вам нужно сделать, так это объявить переменную соединения равным = null перед блоком try и затем инициализировать ее в блоке try. В блоке finally вам нужно проверить, является ли переменная нулевой, а если нет, то закройте ее. – triadiktyo

+0

А, я вижу. Я объявлял соединение внутри попытки, сохраняя область действия этого блока. Вместо этого, я должен только инициализировать в попытке и объявить заранее. – trevalexandro

9

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

Сказав это, удаляйте исключения только тогда, когда вы можете их обработать или хотите их обернуть более подходящим типом. Мой опыт в том, что блоки catch должны быть намного реже, чем блоки try/finally или try-with-resources. Если вы обнаружите, что ловля исключения в большинстве методов, это, вероятно, указывает на то, что вы злоупотребляете ими.

0

Когда у вас есть код, который может вызвать ошибку, вы поместите этот код в try/catch. И когда мы добавляем finally, нужно запустить код, не зависящий от ошибки, отмеченной выше.

PS: строки кода, содержащиеся в 'finally', всегда выполняются.

2

Ответы на Подраздел и Джон прекрасно, но я просто хочу, чтобы дополнить их разъяснение о распространенное заблуждение о том, как finally блок работает, главным образом, ответ на этот общий вопрос:

Что такое разница между размещением кода в блоке finally против его оставления сразу после блока catch?

Некорректного Ответ: код после catch блока не будет выполняться в случае исключения, если не поставить его в finally блоке.

Если это неверно, зачем нам finally?

Ну, прежде всего, код после catch блока будет работать до тех пор, как вы справляетесь всех исключения надлежащим образом, это означает, что исключение не должно спасаясь от try..catch необработанных. finally, с другой стороны, будет работать почти всегда даже в случае необработанного исключения, избегая try..catch. Я сказал «почти», потому что некоторые необработанные исключения могут пропустить блок finally, но это редко.

Еще одно отличие: если вы выйдете из своего кода в try или catch блоков, код после catch блока будет не выполнения. Мы можем думать, что это очевидно, но иногда бывает сложно.Примеры: return, break и continue (если ваш try и код после этого находятся в цикле), throw (если вы используете его в catch для повторного выброса исключения для вызывающего абонента). finally будет выполнять все эти условия.

Последнее, что нужно учитывать: использование finally четко указывает ваше намерение, поэтому оно способствует более надежному и понятному коду. Если вы тщательно обработаете все вышеперечисленные условия и напишите код после catch, считая, что он так же гарантированно работает как блок finally, вы, вероятно, будете в порядке ... Ну, пока другому разработчику не потребуется изменять ваш код в будущем и решает добавить return (например) в try.

Выводы: Если у вас есть код, который вам нужно, чтобы гарантировать его выполнение после try..catch, всегда рекомендуется использовать finally.

+0

Спасибо за ваш вклад Racil, так что даже без окончательного блока ваш код будет выполнять ALMOST всегда после того, как улов данных исключений обрабатывается правильно. Наконец, это более надежный способ обработки кода после улова. – trevalexandro

+0

Точно. Пожалуйста. Не стесняйтесь повышать ответ, если найдете его полезным. –