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