什么情况下,JAVA中执行代码出异常时不经过Catch而直接跳入finally

我有两个方法,A和B,A调用B,当B方法执行到
XSSFWorkbook wb = new XSSFWorkbook();时,后面的代码都没有执行,也没进行Catch中,就直接跳入到A方法的finally 中。请高手指教这是为什么?
A(){
try{
b();
}cathc(Exception e){
System.out.print("error");
}finally {
System.out.print("finally ");
}

B() throws Exception {
try{
XSSFWorkbook wb = new XSSFWorkbook();
System.out.print("new XSSFWorkbook ");
...
}catch(Exception e) {
System.out.print("Exception ");
}
}

有一种可能会出现没有catch异常的情况:当抛出的不是Exception及其子类时,catch(Exception e)将无法捕获该异常。请看如下代码:
public static void main(String[] args) throws Throwable {

try{
throw new Throwable(){

};
}
catch(Exception e){
System.out.println("err");
}
finally{
System.out.println("finally");
}

}
就会不经catch而到输出 finally。

有一个测试方法是加入catch(Throwable t)即可发现是否有上述情况,示例如下:
public static void main(String[] args) throws Throwable {

try{
throw new Throwable(){

};
}
catch(Exception e){
System.out.println("err");
}
catch(Throwable t){
System.out.println("t");
}
finally{
System.out.println("finally");
}

}

这就会输出
t
finally
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-04-01
JAVA中的try{}catch(){}finally{}句型是用来捕获异常的,发生了什么异常就执行哪个catch里面的代码(你对异常进行了分类的情况下,也可以用一个全捕获catch(Exception e){}),至于finall里面的代码,在程序执行了try{}后就一定会被执行(虚拟机突然关闭的情况除外),不管有没有异常发生

所以你的问题的答案就是try{}中没有异常发生时,就会不执行catch,而直接执行finally{}里面的代码
第2个回答  2010-04-01
如果有异常的话
B 中的这个
System.out.print("Exception ");
应该是执行了。
A中没有异常。因为你在B中已经对异常进行过处理,。对于方法A来说B是正确执行,
除非你写成这样, 当B遇到异常时。向A抛出
第3个回答  2010-04-01
try中的代码没有抛出异常,或者抛出的异常catch中没捕获则不经过Catch而直接跳入finally

什么情况下,JAVA中执行代码出异常时不经过Catch而直接跳入finally
有一种可能会出现没有catch异常的情况:当抛出的不是Exception及其子类时,catch(Exception e)将无法捕获该异常。请看如下代码:public static void main(String[] args) throws Throwable { try{ throw new Throwable(){ };} catch(Exception e){ System.out.println("err");} finally{ System.out...

java中异常处理时为什么可以只要try-finally,而可以不要catch啊。
①当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句。②当try捕获到异常,catch语句块里没有处理此异常:这种情况下,该异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行。③当try捕获到异常,catch...

java中,有try没catch有finally怎么用?
有try 和finally没catch,有异常将抛出,但不会提示你,finally里的东西都会执行,finnally主要是关闭数据库用的,你以后就会明白try{}catch+finally的用法

...executeQuery查询的时候语句出错会不进catch里呢,如图啊!
其实是return 和finally执行先后的问题,因为你的catch里面只有一句return,如果先执行return了,就直接跳出方法了,因此,这里会先走到finally,最后执行catch里的return。你可以在catch里面return之前多加几行代码,测试一下。

【Java】finally用法
首先,我们了解finally块会执行的几种情况:当try部分无异常时,finally总是执行。 无论try部分有无异常,只要存在catch块,finally也会执行。 无论try和catch部分有无异常,只要finally中不包含return语句,finally总是执行。 如果try部分有返回值,执行后返回"try return"。 如果catch部分有...

Java里try catch的简单用法
Java中的try-catch结构用于处理程序运行时可能出现的异常。其基本用法是:1. 当代码在try块中执行,如果遇到异常,程序会立即跳转到相应的catch块进行异常处理。处理完异常后,catch块后的语句会继续执行。如果try块中没有异常,catch块会被跳过。扩展部分:2. 在try-catch-finally结构中,程序流程如下:...

求教大神,java中的jdbc程序为什么要加finally,不是加了try catch以后...
与其他语言的模型相比,finally 关键字是对 Java 异常处理模型的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。 如果没有 finally,您的代码就会很费解。finally 块必须与 try 或 try\/catch 块配合使用。此外,不可能退出 try ...

请问在java里有try但没有catch对不对
要看具体情况,java里的异常分2种,运行时异常和非运行时异常,如果是运行时异常,也就是不 强制catch的异常,可以省略catch,直接try finally 否则,如果不catch该异常或者没有在方法中throws,编译无法通过,也就是说要看具体的异常

java 异常不处理会怎么样
一旦出现异常,Exception会一层一层地从被调用处向调用处一直抛,直到有处理异常的方法处理了这个异常。第二种:仅仅是try{}catch(){},或者仅仅是throws 只要try了,不管是catch 还是 finally,try里面的语句都是执行到出异常的那一句,然后跳出try块,接着往catch、finally和finally之后的语句执行 ...

java中try和catch的具体作用
然后把异常交给catch{}里面的代码去处理,最后执行finally之中的代码。无论try中代码有没有异常,也无论catch是否将异常捕获到,finally中的代码都一定会被执行。例如:当除数为0时,编译不会报错,如果没有try\/catch的话,程序直接崩溃。用try\/catch的话,则可以让程序运行下去,并且输出为什么出错。

相似回答