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

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


внутренний, наконец, выполняется до создания исключения для внешнего блока.

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