Java try catch, во время поиска catch программа пропускает строку - PullRequest
0 голосов
/ 21 мая 2018

Я средний по Java, в настоящее время изучаю исключения Java.Я слежу за книгой, научи себя java, и есть программа, где она ищет соответствующий блок catch для обработки исключения.

public class CatchSearchExcercise {

public static void main(String[] args) {
     try{
        System.out.println("Before a");
        a();
        System.out.println("After a");
    }
    catch(Exception e){
        System.out.println("main: " + e);
    }
    finally{
        System.out.println("main: finally");
    }
}

public static void a(){
    try{
    System.out.println("Before b");
        b();
        System.out.println("After b");
    }
    catch(ArithmeticException e){
        System.out.println("a: " + e);
    }
    finally{
        System.out.println("a: finally");
    }      
}

public static void b(){
    try{
    System.out.println("Before c");
        c();
        System.out.println("After c");
    }
    catch(ArrayIndexOutOfBoundsException e){
        System.out.println("b: " + e);
    }
    finally{
        System.out.println("b: finally");
    }     
}

public static void c(){
    try{
    System.out.println("Before d");
        d();
        System.out.println("After d");
    }
    catch(NumberFormatException e){
        System.out.println("c: " + e);
    }
    finally{
        System.out.println("c: finally");
    }     
}

public static void d(){
    try{
    Object obj = new Float("85.56");
    System.out.println("Before cast");
    Double dobj = (Double)obj;
    System.out.println("After cast");
    }
    catch(ClassCastException e){
        System.out.println("d: " + e);
        int i = 1;
        int j = 0;
        System.out.println("Before division");
        int k = i/j;
        System.out.println("After division");
        System.out.println(k);
    }
    finally{
        System.out.println("d: finally");
    }     
}

}

Когда я запускаю программу, она показывает:

Before a
Before b
Before c
Before d
Before cast
d: java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.Double
Before division
d: finally
c: finally
b: finally
a: java.lang.ArithmeticException: / by zero
a: finally
After a
main: finally

Мой вопрос: почему не выполняется System.out.println("After b");?Как следует за потоком программы, она должна отображаться, но она сразу переходит к улову?Может кто-нибудь объяснить это, пожалуйста, и заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Я предполагаю, что вы хотели спросить, почему System.out.println("After b"); не может выполнить.это потому, что исключение возникает внутри каждого из методов (то есть d бросает к c, затем c бросает к b и b бросает к a).каждый из них пытается перехватить исключение, но не может, поскольку их блок catch перехватывает только другие типы исключений.в итоге исключение возникает внутри a() и успешно перехватывается, поскольку a() перехватывает ArithmeticException, который выбрасывает d().

0 голосов
/ 21 мая 2018

Во время выполнения d() -метода в catch -Блоке выдается java.lang.ArithmeticException, поскольку код пытается разделить на 0.

Поскольку метод не обрабатывает выброшенный ArithmeticException, блок finally будет выполнен, и исключение будет передано вызывающему методу, который является c() -методом.

В методе c() больше код не будет выполняться в try -блоке после вызова d(), поскольку во время выполнения d() возникло необработанное исключение.Java проверяет, обрабатывается ли исключение в одном из блоков catch этого метода.Это не тот случай, поэтому будет выполнен finally -блок, и исключение будет передано вызывающему методу, который является b() -методом.

Это продолжается до тех пор, пока один из вызывающих методов не перехватитArithmeticException, что имеет место в a() -методе.Если ни один из методов потока программы не перехватит это исключение, JVM завершит поток и выведет трассировку стека на консоль.

0 голосов
/ 21 мая 2018

java.lang.ArithmeticException выбрасывается в блок catch(ClassCatchException) d().Затем все пузыри возвращаются обратно к a(), потому что ни c(), ни b() не ловят его, а a() делает.Таким образом, короткий ответ на вызов b(), по сути, вызывает исключение, хотя источником была строка d().

...