Thinking in Java 12章的一个例子. 刚开始看到的现象跟预期的不一样,我稍微改了一下.
class MyException2 extends Exception{
private int x;
public MyException2(){
super();
}
public MyException2(String msg){
super(msg);
}
public MyException2(String msg,int x){
super(msg);
this.x = x;
}
public int val(){
return x;
}
public String getMessage(){
return "Detail Message: "+x+" "+super.getMessage();
}
}
public class ExtralFeature {
public static void f() throws MyException2{
System.out.println("Throwing MyExcetion2 from f()");
throw new MyException2();
}
public static void g() throws MyException2{
System.out.println("Throwing MyExcetion2 from g()");
throw new MyException2("Originated in g()");
}
public static void h() throws MyException2{
System.out.println("Throwing MyExcetion2 from h()");
throw new MyException2("Originated in h()",47);
}
public static void main(String[] args) {
for(int i=0;i<5;i++){
try {
f();
} catch (MyException2 e) {
// TODO: handle exception
e.printStackTrace();
}
try {
g();
} catch (MyException2 e) {
// TODO: handle exception
e.printStackTrace();
}
try {
h();
} catch (MyException2 e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("e.val="+e.val());
}
System.out.println("========================================");
}
}
}
我的理解,mian方法中,执行到f()方法的时候,抛出异常,程序暂停,进入catch块中去处理. 完事儿之后返回,继续往下执行下一个try块中的g()方法,g()方法抛出异常之后,进入g()方法的catch块处理...
打印的结果应该是:
引用 Throwing MyExcetion2 from f()
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
Throwing MyExcetion2 from g()
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
Throwing MyExcetion2 from h()
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
e.val=47
========================================
Throwing MyExcetion2 from f()
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
Throwing MyExcetion2 from g()
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
Throwing MyExcetion2 from h()
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
e.val=47
========================================
Throwing MyExcetion2 from f()
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
Throwing MyExcetion2 from g()
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
Throwing MyExcetion2 from h()
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
e.val=47
========================================
Throwing MyExcetion2 from f()
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
Throwing MyExcetion2 from g()
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
Throwing MyExcetion2 from h()
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
e.val=47
========================================
Throwing MyExcetion2 from f()
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
Throwing MyExcetion2 from g()
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
Throwing MyExcetion2 from h()
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
e.val=47
========================================
但是正常执行的时候可能是这个样子:
引用 Throwing MyExcetion2 from f()
Throwing MyExcetion2 from g()
Throwing MyExcetion2 from h()
e.val=47
========================================
Throwing MyExcetion2 from f()
Throwing MyExcetion2 from g()
Throwing MyExcetion2 from h()
e.val=47
========================================
Throwing MyExcetion2 from f()
Throwing MyExcetion2 from g()
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
Throwing MyExcetion2 from h()
e.val=47
========================================
Throwing MyExcetion2 from f()
Throwing MyExcetion2 from g()
Throwing MyExcetion2 from h()
e.val=47
========================================
Throwing MyExcetion2 from f()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
ch12_Exception.MyException2: Detail Message: 0 null
at ch12_Exception.ExtralFeature.f(ExtralFeature.java:25)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:39)
ch12_Exception.MyException2: Detail Message: 0 Originated in g()
at ch12_Exception.ExtralFeature.g(ExtralFeature.java:29)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:45)
ch12_Exception.MyException2: Detail Message: 47 Originated in h()
at ch12_Exception.ExtralFeature.h(ExtralFeature.java:33)
at ch12_Exception.ExtralFeature.main(ExtralFeature.java:52)
Throwing MyExcetion2 from g()
Throwing MyExcetion2 from h()
e.val=47
========================================
看上去好像在多线程执行一样. 刚学java,不是很懂. 是我理解错了吗? 还是说正确的应该是,main线程一直在执行,遇到f()方法抛出异常,将catch块交给另外一个线程,然后main这个线程会继续往下执行.