上午在搜索"System.runFinalization"的时候,搜到 http://www.cnblogs.com/Skyar/p/5962253.html ,其中有关于try-catch-finally的部分,特整理如下
先看下面这个方法的返回值
public static String test(){
String x="";
String y=null;
try{
x=y.replace("A","B");
return x+"C";
}catch(Exception e){
x="D";
return x+="EFG";
}finally{
x=x+"H";
return x; //返回DEFGH
}
}
执行过程
- 执行try块:执行中抛出一个"NullPointerException",被catch块捕获;return语句得不到执行
- 执行catch块:x="D"。此时x=D
- 执行catch块:x+="EFG"。此时x=DEFG,return操作挂起
- 执行finally块:x=x+"H"。此时x=DEFGH
- 执行finally块:return x。将x=DEFGH返回给调用者
- 该方法结束
执行机制
- 如果try中没有异常抛出
- 执行到try块时,如果return后面跟的是个语句,把该语句运算完,暂时放下不return;
- 寻找并执行finally语句块,如果finally中有return语句,就执行并return,方法结束;如果没有return语句,就返回执行try中的return,方法结束
- 如果try中抛出异常
- try块中抛出异常的这个语句后面的语句都不会执行,后面的return执行不到
- catch块捕获后,执行catch块,到return语句时,运算完return后面的语句,暂时放下不return
- 寻找并执行finally语句块,遇到return语句,运算并return,方法结束;如果没有return语句,就返回执行catch的return,方法结束