我是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");
执行?跟随程序的流程它应该显示但它直接跳到捕获?有人可以解释一下,并提前感谢你。
答案 0 :(得分:0)
java.lang.ArithmeticException
被catch(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将终止该线程并将堆栈跟踪打印到控制台上。