2016-08-24 2 views
-1

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

class Excp 
{ 
public static void main(String args[]) 
{ 
    int a,b,c; 
    try 
    { 
    a=0; 
    b=10; 
    c=b/a; 
    System.out.println("This line will not be executed"); 
    } 
    catch(ArithmeticException e) 
    { 
    System.out.println("Divided by zero"); 
    } 
    System.out.println("After exception is handled"); 
} 
} 

Нет никакой разницы, если я поместил последний оператор печати внутри блока finally.

+0

Бросьте 'новое RuntimeException()' внутри 'try', и вы заметите, что код после блокировки catch не выполняется. Затем добавьте блок finally. – Kayaman

+0

Вы используете блок 'finally', чтобы настроить вашу программу на статус, с которым она может работать после того, как произошло какое-либо исключение. – Blobonat

+1

Код внутри блока finally ** всегда ** выполняется, даже если в 'try' или' catch' есть 'return' или необработанное исключение. Это объясняется [здесь] (https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html), который был найден с очень простым поиском google. ** Пожалуйста, используйте google. ** –

ответ

2

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

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

Это особенно полезно для выполнения задач по очистке вне досягаемости сборщика мусора: система Ressource, блокировка базы данных, удаление файлов и т.д. ...

0

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

примеры:

try { 
    int a=5; 
    int b=0; 
    int c=a/b; 
catch (NullPointerException e) { 
    // won't reach here 
} finally { 
    // will reach here 
} 

Вы также можете пропустить блок поймать полностью и все еще гарантируют, что, наконец, блок будет выполнен:

try { 
    int a=5; 
    int b=0; 
    int c=a/b; 
} finally { 
    // will reach here 
} 
1

Рассмотрим это:

try { 
    a=0; 
    b=10; 
    c=b/a; 
    System.out.println("This line will not be executed"); 
} 
catch(ArithmeticException e){ 
    throw new RuntimeException("Stuff went wrong", e); 
} 
System.out.println("This line will also not be executed"); 
0

код внутри блока finally всегда выполняет, даже если в try или catch существует return или необработанное исключение. Об этом сообщается here, который был найден с очень простым поиском google. Используйте Google.

1

блок finally может использоваться для выполнения даже после возврата функции.

например.

public boolean doSmth() { 
    try { 
    return true; 
    } 
    finally { 
    return false; 
    } 
} 

вернется с ошибкой;

Смежные вопросы