首先是最基本的一点 try catch代码块是可嵌套的
try catch嵌套,内层不能捕获时,会考虑外层内否捕获,内层能捕获,则外层catch不执行。
那么多个catch怎么执行,看一个例子
public class ExceptionTryCatchTest {
public void doSomething() throws IOException{
System.out.println("do somthing");
}
public static void main(String[] args){
ExceptionTryCatchTest etct = new ExceptionTryCatchTest();
try {
etct.doSomething();
} catch (Exception e) {
} catch (IOException e) {
}
}
}
上面的程序不能编译通过。
编译的时候会报错:已捕捉到异常 java.io.IOException。 catch(IOException e)这句有错误。
分析:对于try..catch捕获异常的形式来说,对于异常的捕获,可以有多个catch。对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。如果有finally的话进入到finally里面继续执行。换句话说,如果有匹配的catch,它就会忽略掉这个catch后面所有的catch。对我们这个方法来说,抛出的是IOException,当执行etct.doSomething();时,可能会抛出IOException,一但抛出IOException,它首先进入到catch (Exception e) {}里面,先和Exception匹配,由于IOException extends Exception,根据多态的原则,IOException是匹配Exception的,所以程序就会进入到catch (Exception e) {}里面,进入到第一个catch后,后面的catch都不会执行了,所以catch (IOException e) {}永远都执行不到,就给我们报出了前面的错误:已捕捉到异常 java.io.IOException。
还有几个关于return的总结
1. 当catch中没有return返回语句是,try catch finally是按从上到下的顺序依次执行!
2. 当catch中有return语句时,执行结果是先执行catch中的内容,当执行到return的时候,先去执行finally中的内容,最后执行return语句。
3. 当catch和finally中都有return字句时,finally中的return字句会覆盖catch中的return返回值.
4. 当catch中有return字句,而finally中没有return字句,不过finally中有改变catch中return的返回值时(注意:当返回值类型为基本类型,string, Date类型时,在finally中修改返回值的值时,不影响catch中return的返回值结果)
public static String test() {
String string="";
try {
System.out.println(2 / 0);
} catch (ArithmeticException ae) {
string="shi";
return string;
} finally {
System.out.println("catch成功!");
string="ss";
}
return "";
}
上面代码最终返回的结果并不是“ss”,而是“shi”,对于返回基本的数据类型也是这样,finally中不会改变返回值。
当catch中有return字句,而finally中没有return字句,不过finally中有改变catch中return的返回值时(注意:当返回值类型为list,map,数组时,在finally中修改返回值的值时,会影响catch中return的返回值结果):
public static int[] test() {
int[] a={1,2,3};
try {
System.out.println(2 / 0);
} catch (ArithmeticException ae) {
return a;
} finally {
System.out.println("catch成功!");
a[0]=10;
}
return a;
}
这种返回引用类型,finally中的改变就是有效的,上面的代码中返回是数组中a[0]已经该变成10