import java.io.*;
public class Mine{
public int method0(){
try{
FileInputStream dis =new FileInputStream("Hello.txt"); //1,抛出异常
}catch ( IOException ex) {
System.out.println("No such file found"); //2.catch捕获异常,并执行
return -1; //4,return 返回
}finally{
System.out.println("Doing finally"); //3.finally一定会执行,在return之前。
}
return 0;
}
public int method1(int i){
try {
System.out.println("try块...");
return i = i + 5;
// 执行次序为,首先try块中return之前的部分,然后return之后的部分,
//接着转入finally块继续执行,(如果finally块没有返回语句),执行完finally块,
//再回到try块,执行return语句.
//注意: 这种执行顺序只是保证了finally块一定会被执行,
//但finally块的语句对try块的return没有影响.
//假如传入的参数i=0
//则该方法返回值为5(而不是6!)
} finally {
i++;
System.out.println("in finally i = " + i);
}
}
public int method2(int i){
try {
System.out.println("try块...");
return i = i + 5;
// 执行次序为,首先try块中return之前的部分,然后return之后的部分,
//接着转入finally块继续执行,(由于finally块含有返回语句),
//程序从finally块的return语句直接返回,不再执行try块的return
//即:如果在finally语句中也有return,则try语句中的return值会被替换,
//不过这种写法应该是要避免的!
//假如传入的参数i=0
//则该方法返回值为6(而不是5!)
} finally {
i++;
System.out.println("in finally i = " + i);
return i ;
}
}
public static void main(String argv[]){
Mine m=new Mine();
System.out.println( m.method0());
int i = 0;
System.out.println(" ***********m.method1(i)********" );
System.out.println("init i = "+i);
System.out.println( m.method1(i) );
System.out.println("after method1(i), i= "+i ); //java的值传递u
System.out.println(" ***********m.method2(i)********" );
System.out.println("init i = "+i);
System.out.println( m.method2(i) );
System.out.println("after method2(i), i= "+i ); //java的值传递u
}
}
输出结果为:
No such file found
Doing finally
-1
***********m.method1(i)********
init i = 0
try块...
in finally i = 6
5
after method1(i), i= 0
***********m.method2(i)********
init i = 0
try块...
in finally i = 6
6
after method2(i), i= 0
结论:
执行次序为:
首先try块中return之前的部分,然后return之后的部分(假如关键字return后有运算的话),
接着转入finally块继续执行,(如果finally块没有返回语句),执行完finally块,
再回到try块,执行return语句.
注意: 这种执行顺序只是保证了finally块一定会被执行, 但finally块的执行结果对try块的return没有影响.
此外, 如果finally里面有return,try中的return不会再执行;
如果try中有了异常,try中的return也不执行(似乎是很显然的,抛出异常的代码后面的都不会被执行). PS:异常实际上也是一种返回值
程序在catch块中的执行情况,和try块一样.(先catch块return之前的部分,然后return之后的运算, 接着转入finally块继续执行,执行完finally块,再回到catch块,执行return语句)
from:http://hi.baidu.com/shenmike/blog/item/9f6f602cc9e81fed8a139992.html