Java Try Catch наконец-то блокирует без улова


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

9 97

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

(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, он становится уродливым. Откровенно говоря, Я точно забыл, что происходит (так много для моей сертификации лет назад). Я думаю оба 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 вы не сможете иметь ни того, ни другого!

вы не пробовали это с этой программой? Это будет goto finally block и выполнение finally block, Но исключение не будет обработано. Но, это исключение может быть отменено в блоке finally!

блок finally выполняется после завершения блока try. Если что-то бросается внутри блока try, когда он покидает блок finally выполняется.