Java Try Catch наконец-то блокирует без улова
Я просматриваю какой-то новый код. Программа имеет только попытку и блок finally. Поскольку блок catch исключен, как работает блок try, если он встречает исключение или что-то бросаемое? Он просто идет прямо к последнему блоку?
9 ответов:
Если какой-либо код в блоке try может вызвать проверенное исключение, оно должно появиться в предложении throws сигнатуры метода. Если выбрасывается непроверенное исключение,оно выводится из метода.
блок finally всегда выполняется, независимо от того, вызвано исключение или нет.
небольшая заметка о
try
/finally
: The finally всегда будет выполняться, если
System.exit()
называется.- сбой JVM.
- The
try{}
блок никогда не заканчивается (например, бесконечный цикл).
Спецификация Языка Java(1) описывает как
try-catch-finally
выполняется. Отсутствие улова эквивалентно отсутствию улова, способного поймать данный бросок.
- если выполнение блока try завершается резко из-за броска значения V, то есть выбор:
- если тип времени выполнения V присваивается параметру любого предложения catch оператора try, то...
…- если тип времени выполнения V не присваивается параметру любого предложения catch оператора try,затем выполняется блок finally. Тогда есть выбор:
- если блок finally завершается нормально, то оператор try завершается резко из-за броска значения V.
- если блок finally завершается внезапно по причине S, то оператор try завершается внезапно по причине S (и бросок значения V выбрасывается и забывается).
внутренний, наконец, выполняется до того, как выбросить исключение для внешнего блока.
public class TryCatchFinally { public static void main(String[] args) throws Exception { try{ System.out.println('A'); try{ System.out.println('B'); throw new Exception("threw exception in B"); } finally { System.out.println('X'); } //any code here in the first try block //is unreachable if an exception occurs in the second try block } catch(Exception e) { System.out.println('Y'); } finally { System.out.println('Z'); } } }
результаты
A B X Y Z
блок finally всегда запускается после завершения блока try, независимо от того, заканчивается ли try нормально или ненормально из-за исключения, er, throwable.
Если исключение выбрасывается любым кодом в блоке try, то текущий метод просто повторно выбрасывает (или продолжает выбрасывать) то же самое исключение (после запуска блока finally).
Если блок finally выдает исключение / ошибку / throwable, и уже есть ожидающий throwable, он становится уродливым. Откровенно говоря, Я точно забыл, что происходит (так много для моей сертификации лет назад). Я думаю оба throwables связаны вместе, но есть какое - то специальное вуду, которое вам нужно сделать (т. е.-вызов метода, который я должен был бы посмотреть), чтобы получить исходную проблему до того, как "наконец" вырвало, э-э, вырвало.
кстати, try / finally-довольно распространенная вещь для управления ресурсами, поскольку java не имеет деструкторов.
например -
r = new LeakyThing(); try { useResource( r); } finally { r.release(); } // close, destroy, etc
"наконец-то", один еще совет: если вы do удосужились поставить в catch, либо перехватывать определенные (ожидаемые) забрасываемых подклассы, или просто поймать "перекидным", не "исключение", для общей ловушки всех ошибок. Слишком много проблем, таких как отражение goofs, бросают "ошибки", а не "исключения", и они будут проскальзывать прямо мимо любого "поймать все", закодированного как:
catch ( Exception e) ... // doesn't really catch *all*, eh?
вместо этого:
catch ( Throwable t) ...
версии Java до версии 7 позволяют использовать эти три комбинации try-catch-finally...
try - catch try - catch - finally try - finally
finally
блок всегда будет выполняться независимо от того, что происходит вtry
иcatch
заблокировать. так что, если нетcatch
блок, исключение не будет обработано здесь.однако вам все равно понадобится обработчик исключений где - то в вашем коде-если вы, конечно, не хотите, чтобы ваше приложение полностью рухнуло. Это зависит от архитектура вашего приложения именно там, где этот обработчик.
- Java try block должен сопровождаться либо catch, либо finally block.
- для каждого блока try может быть ноль или более блоков catch, но только один блок finally.
- блок finally не будет выполнен, если программа завершит работу(либо путем вызова System.выход () или вызвав фатальную ошибку, которая приводит к прерыванию процесса).
как работает блок try, если он встречает исключение или что-нибудь throwable
исключение из блока, как и в любом другом случае, когда он не поймал.
блок finally выполняется независимо от того, как блок try выходит-независимо от того, есть ли какие-либо уловы вообще, независимо от того, есть ли соответствующий улов.
блоки catch и finally являются ортогональными частями try блок. Вы можете иметь либо то, либо другое. С Java 7 вы не сможете иметь ни того, ни другого!