Java try catch,在catch搜索期间,程序会跳过一行

时间:2018-05-21 16:15:09

标签: java exception try-catch

我是Java的中间人,我目前正在学习Java Exceptions。我跟着这本书自学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 :(得分:0)

java.lang.ArithmeticExceptioncatch(ClassCatchException)d()抛出。然后它会一直回到a(),因为niether c()b()会抓住它,但是a()会抓住它。因此,简短回答调用为b()实际上会引发异常,尽管源是行d()

答案 1 :(得分:0)

我假设您打算问为什么System.out.println("After b");无法执行。这是因为在每个方法中引发了异常(即d抛出到c然后c抛出到b然后b抛出到a)。他们每个人都试图捕获异常,但他们不能解决,因为他们的catch块只能捕获其他类型的异常。最终在a()内引发了异常,并且由于a()正在捕获ArithmeticException正在投掷的d()而成功捕获。

答案 2 :(得分:0)

在执行d()中的catch - 方法期间 - 由于代码试图除以0,因此抛出java.lang.ArithmeticException

由于该方法不处理抛出的ArithmeticException,因此将执行finally块,并将异常传递给调用方法,即c() - 方法。

c() - 方法中,在调用try之后,d() - 块中不再执行任何代码,因为在执行{{1}期间抛出了未处理的异常}。 Java查看是否在此方法的catch块中处理异常。情况并非如此,因此d() - 块将被执行,异常将被传递给调用方法,即finally - 方法。

这种情况一直持续到其中一个调用方法捕获b(),这是ArithmeticException - 方法中的情况。如果程序流的方法没有捕获到这个异常,JVM将终止该线程并将堆栈跟踪打印到控制台上。