Java Try Catch Наконец блоки без Catch

Я просматриваю новый код. В программе есть попытка и только блок finally. Поскольку блок catch исключен, как работает блок try, если он встречает исключение или что-то подобное? Он просто переходит непосредственно к блоку finally?

Ответ 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 отбрасывается и забывается).

(1) Выполнение try-catch-finally

Ответ 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, выполняется.