2016-06-26 3 views
-4

В Java, почему "наконец," блок существует:В чем причина окончательного исполнения последнего блока?

try { 
    ... 
} catch(...) { 
    ... 
} finally { 
    // instructions lastly executed when the "try" block is quit 
} 

вместо блока "во-первых"?

try { 
    ... 
} firstly { 
    // instructions firstly executed when the "try" block is quit 
} catch(...) { 
    ... 
} 
+1

Что такое блок «firstly»? – tkausl

+1

Просьба подробно остановиться на блоке 'firstly' –

+0

Блок« firstly »на самом деле не существует, и мой вопрос заключается в том, почему он не существует вместо« finally ». – Codoscope

ответ

0

В Java, почему же «наконец,» блок существует:

finally блок существует, так что он всегда выполняется независимо от того, где происходит Exception (либо в try или в catch или вообще не происходит). finally используется, чтобы поместить код, как закрытие потоков файлов, очистка коды и т.п. ...

Если вам не нравится finally, то есть try ресурсов. Вы можете использовать это.

В Java, почему существует блок «finally», а не «первый» блок?

Как следует из названия finally должен содержать код очистки, она не может быть помещен перед catch и назвать некоторые фантазии firstly. Код в finally выполнен, даже если Exception поднят в блоке catch.

+0

Боюсь, что дело не в этом. Первый блок выполняется, даже если в предложении catch возникает исключение. Первый блок может содержать код очистки, а также, наконец, один. – Codoscope

+0

@ Qu'est-cet'yont Тогда как «окончательно» отличается от «firstly» вообще? –

+0

Единственное различие заключается в том, что первый блок выполняется перед предложениями catch, а не после того, как это делает блок finally. Так, например, он может правильно закрыть ресурсы перед блоками catch (которые могли бы сделать System.exit ...). – Codoscope

1

Это было бы таким же, как

try { 
    try { 
     ... 
    } finally { 
     // instructions firstly executed when the outer "try" block is quit 
    } 
} catch(...) { 
    ... 
} 

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

Единственное отличие состоит в том, что первый блок выполняется перед предложениями catch, а не после того, как это делает блок finally. Так, например, он может правильно закрыть ресурсы перед блоками catch (которые могли бы сделать System.exit ...).

Я предполагаю, что закрытие ресурсов имеет смысл разместить в конце блока, а не в середине.

+1

Вы получаете точку. Однако локальные переменные в блоке try не могут использоваться в catch. Если они объявлены снаружи, они могут быть нулевыми (поскольку исключение не позволяло им инициализироваться перед уловом). Кроме того, ресурс может запустить исключение с попыткой создать его, и он не может быть использован в catch. Btw: окончательно будет то же самое, что: 'try {try {...} catch ...} firstly {...}'. – Codoscope

+0

@ Qu'est-cet'yont Я думаю, что у вас есть точка и + 1 задал ваш вопрос, но я думаю, что это не так логично устроить таким образом, хотя это может быть потому, что я использую то, что есть. Возможно, он работает таким образом, на каком-то языке они скопировали эту функцию. –

+0

Спасибо. Я добавляю +1 к вашему ответу, потому что он приносит некоторые ответы (хотя он не решает его полностью). Я не понимаю, почему у меня возникают отрицательные моменты по этому вопросу. – Codoscope

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