Java Try Catch Наконец блоки без Catch - PullRequest
114 голосов
/ 30 декабря 2010

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

Ответы [ 9 ]

120 голосов
/ 30 декабря 2010

Если какой-либо код в блоке try может выдать проверенное исключение, оно должно появиться в предложении throws сигнатуры метода.Если выброшено непроверенное исключение, оно выходит из метода.

Блок finally выполняется всегда, вне зависимости от того, сгенерировано исключение или нет.

88 голосов
/ 30 декабря 2010

Небольшая заметка о try / finally: Команда finally всегда будет выполняться, если не вызывается

  • System.exit().
  • Сбой JVM.
  • Блок try{} никогда не заканчивается (например, бесконечный цикл).
36 голосов
/ 30 декабря 2010

Спецификация языка 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

14 голосов
/ 01 июля 2016

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

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
6 голосов
/ 30 декабря 2010

Блок finally всегда запускается после завершения блока try, независимо от того, завершается ли попытка нормально или ненормально из-за исключительной ситуации, например, throwable.

Если исключение выдается каким-либо кодом из блока try, тогда текущий метод просто повторно генерирует (или продолжает генерировать) то же исключение (после запуска блока finally).

Если блок finally генерирует исключение / ошибку / throwable, и уже существует ожидающийбросаемый, это становится уродливым.Откровенно говоря, я забыл, что именно происходит (так много для моей сертификации лет назад).Я думаю , что оба throwables связаны друг с другом, но есть какое-то специальное вуду, которое вы должны сделать (то есть - вызов метода, который я должен был бы найти), чтобы получить исходную проблему до того, как "finally" вызовет ошибку., вырвало.

Кстати, попробуйте / наконец-то довольно распространенная вещь для управления ресурсами, так как у java нет деструкторов.

Например -

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc

"И, наконец, «еще один совет: если вы делаете потрудитесь поставить поймать, либо поймать определенные (ожидаемые) бросаемые подклассы, либо просто поймать« Throwable », not « Exception »,для общей ловушки всех ошибок.Слишком много проблем, таких как размышления, выбрасывают «Ошибки», а не «Исключения», и они будут проскальзывать под любым «поймать все», закодированным как:

catch ( Exception e) ...  // doesn't really catch *all*, eh?

, сделайте это вместо:

catch ( Throwable t) ...
3 голосов
/ 16 октября 2016

Java-версии до версии 7 допускают эти три комбинации блока try-catch-finally ...

try - catch
try - catch - finally
try - finally

finally всегда будет выполняться независимо от того, что происходитв блоке try или / и catch.поэтому, если нет блока catch, исключение здесь не будет обрабатываться.

Однако вам все равно понадобится обработчик исключений где-то в вашем коде - если, конечно, вы не хотите, чтобы приложение полностью аварийно завершало работу.Это зависит от архитектуры вашего приложения, где именно находится этот обработчик.

  • За блоком Java try должен следовать либо блок catch, либо блок finally.
  • Для каждого блока tryможет быть ноль или более блоков перехвата, но только один блок finally.
  • Блок finally не будет выполнен, если программа завершится (либо путем вызова System.exit (), либо из-за фатальной ошибки, которая вызывает процесспрервать).
2 голосов
/ 30 декабря 2010

как работает блок try, если он встречает исключение или что-то выбрасываемое

Исключение выбрасывается из блока, как и в любом другом случае, когда оно не перехватывается.1005 *

Блок finally выполняется независимо от выхода из блока try - независимо от того, имеются ли какие-либо перехваты вообще, независимо от того, имеется ли совпадающий перехват.

Блоки перехвата и оператор finallyявляются ортогональными частями блока try.Вы можете иметь один или оба.С Java 7 у вас не будет ни того, ни другого!

1 голос
/ 30 декабря 2010

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

1 голос
/ 30 декабря 2010

Разве вы не пробовали это с этой программой?Он переходит в блок finally и выполняет блок finally, но исключение не будет обработано.Но это исключение может быть отменено в блоке finally!

...