Java Try Catch окончательно блокирует без Catch
Я просматриваю новый код. Программа имеет try и только блок finally. Поскольку блок catch исключен, как работает блок try, если он сталкивается с исключением или чем-либо throwable? Он просто идет прямо к блоку finally?
9 ответов
Если какой-либо код в блоке try может вызвать проверенное исключение, он должен появиться в предложении throws подписи метода. Если выбрасывается непроверенное исключение,оно выводится из метода.
блок finally всегда выполняется, независимо от того, вызвано исключение или нет.
небольшая заметка о try
/finally
: The finally всегда будет выполняться, если
-
System.exit()
называется. - сбой JVM.
- на
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, он становится уродливым. Откровенно говоря, Я забыл, что именно происходит (так много для моей сертификации лет назад). Я!--8-->думаю оба throwables связаны вместе, но есть некоторые специальные вуду, которые вы должны сделать (т. е. вызов метода, который я должен был бы посмотреть), чтобы получить исходную проблему до того, как "наконец" вырвало, э - э, вырвало.
кстати, try / finally-довольно распространенная вещь для управления ресурсами, так как java не имеет деструкторов.
Е. Г. -
r = new LeakyThing();
try { useResource( r); }
finally { r.release(); } // close, destroy, etc
"наконец-то", один еще совет: если вы do потрудитесь вставить улов, либо поймать конкретные (ожидаемые) подклассы throwable, либо просто поймать "Throwable", не "исключение", для общей ловушки ошибок catch-all. Слишком много проблем, таких как отражение goofs, бросают "ошибки", а не "исключения", и они будут проскальзывать мимо любого "поймать все", закодированного как:
catch ( Exception e) ... // doesn't really catch *all*, eh?
вместо этого:
catch ( Throwable t) ...
версии Java до версии 7 позволяют использовать эти три комбинации try-catch-наконец...
try - catch
try - catch - finally
try - finally
finally
блок всегда будет выполняться независимо от того, что происходит в try
и catch
заблокировать. так что, если нет catch
блок, исключение не будет обработано здесь.
однако вам все равно понадобится обработчик исключений где - то в вашем коде-если вы, конечно, не хотите, чтобы ваше приложение полностью разбилось. Это зависит от архитектура вашего приложения именно там, где этот обработчик.
- Java try block должен сопровождаться либо catch, либо finally block.
- для каждого блока try может быть ноль или более блоков catch,но только один блок finally.
- блок finally не будет выполнен, если программа выйдет(либо путем вызова System.exit () или вызывая фатальную ошибку, которая приводит к прерыванию процесса).
как работает блок try, если он встречает исключение или что-то еще throwable
исключение из блока, как и в любом другом случае, когда он не поймал.
блок finally выполняется независимо от того, как блок try выходит-независимо от того, есть ли какие-либо уловы вообще, независимо от того, есть ли соответствующий улов.
блоки catch и, наконец, ортогональные части попытки блок. Вы можете иметь один или оба. С Java 7 у вас не будет ни того, ни другого!
разве вы не попробуете это с этой программой? Он будет, наконец, блокировать и выполнять блок finally, но исключение не будет обработано. Но, это исключение может быть отменено в блоке finally!
блок finally выполняется после завершения блока try. Если что-то бросается внутри блока try, когда он покидает блок finally выполняется.