class VeryImportantException extends Exception{
private static final long serialVersionUID = 1L;
public String toString(){
return "very important";
}
}class ImportantException extends Exception{
private static final long serialVersionUID = 1L;
public String toString(){
return "important";
}
}public class LostMessage {
public void f() throws VeryImportantException{
throw new VeryImportantException();
}
public void g() throws ImportantException{
throw new ImportantException();
}
public static void main(String[] args) throws Exception {
LostMessage lm=new LostMessage();
try{
lm.f();
}
finally{
lm.g();
} }}
结果为:Exception in thread "main" important
at LostMessage.g(LostMessage.java:33)
at LostMessage.main(LostMessage.java:41)
把f()的异常给屏蔽了,因为finally()中的g()
private static final long serialVersionUID = 1L;
public String toString(){
return "very important";
}
}class ImportantException extends Exception{
private static final long serialVersionUID = 1L;
public String toString(){
return "important";
}
}public class LostMessage {
public void f() throws VeryImportantException{
throw new VeryImportantException();
}
public void g() throws ImportantException{
throw new ImportantException();
}
public static void main(String[] args) throws Exception {
LostMessage lm=new LostMessage();
try{
lm.f();
}
finally{
lm.g();
} }}
结果为:Exception in thread "main" important
at LostMessage.g(LostMessage.java:33)
at LostMessage.main(LostMessage.java:41)
把f()的异常给屏蔽了,因为finally()中的g()
连Think in java作者,也认为这是个问题,不信你去看看,我刚看到
不能将一切都依赖于语言,实际上,
try{
throw new Exception();
}finally{
return;
}
这样也会导致异常消失。记得以前看过一篇文章,
continue, break, return, throw exception
是属于 同一类的程序流的跳转,
任何最新出现的 跳转 都会覆盖 之前出现的。
比如上面这里,在 finally 中,有一个 throw excpetion 的跳转,
但被最新的 return 所覆盖了,导致其中的 exception 消失了。
楼主的情况就是新的 exception 覆盖了旧的。还可以再试这些:
for(int i=0; i<1; i++){
try{
throw new Exception();
}finally{
continue;
}
}for(;;){
try{
throw new Exception();
}finally{
break;
}
}同样发现异常神奇地消失了。
原则上,程序碰到异常就退出去了。所以只有一个异常能显示出来。
但是,“finally”是一定执行的。它里面又出现了异常。结束。
且异常信息在堆栈中一定靠上。所以输出finally里的那个异常信息。
如果我再跟你说,这问题是作者提出的,你还会说“自己的编程思想和习惯有问题了”吗?我看不会,哎,我就不说什么了