异常处理流程代码可以放在任何可以放可执行代码的地方,因此完整的异常处理流程既可以放在try块里,也可以放在catch块里,还可以放在finally块里。try-catch-finally处理异常时,可以进行代码块的镶嵌使用。
public static void main(String[] args) {
try{
//A
try{
//B
}catch{
//C
}finally{
//D
}
//E
}catch{
//F
}finally{
//G
}
}
若抛出异常在A、E处,则由外层catch块捕获,并且执行外层finally,即执行G;
若抛出异常在内层B处,且被内层中的catch捕获,则执行内层finally语句,然后再执行外层的finally语句,即先执行D后在执行E最后执行G;
若抛出异常在内层B处,但是内层没有catch可以捕获,则执行内层finally后再在外层catch寻找合适的catch块,然后执行外层的finally语句块,不会执行E;
若抛出异常在内层C处,则会退出内层catch块,先执行内层finally语句块,搜索外层catch,找到合适的处理程序,并执行外层finally语句块;
若抛出异常在内层D处,则退出finally块,搜索外层catch语句块,找到合适的处理程序,执行外层finally。