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 вы не сможете иметь ни того, ни другого!