答案是不一定,有如下几种情况:
1.异常出现在try代码块之前,本质上是由于异常位置估计错误
int getResult()
{
int[] temp={1,2,3};
System.out.Println(temp[4]);
try{
System.out.Println("try method");
}
catch(Exception e)
{
System.out.Println("catch method");
}
finally {
System.out.Println("finally method");
}
}
2.即使执行了try,也不一定执行finally,比如:System.exit(0);它表示退出当前Java虚拟机,一旦退出Java虚拟机,任何代码都不会再执行。
3.即使没写System.exit(0) 也不一定会执行,来看try catch finally中有return的情况
static int temp()
{
int i=6;
try{
/* int a=10/0; */
System.out.println("try");
return 0;
}
catch (Exception ex)
{
System.out.println("catch");
return 1;
}
finally {
System.out.println("finally");
}
}
在try或catch后,先打印了finally信息,然后通过return返回了数据,finally先执行后输出了结果
4.在上边的例子中假如:
static int temp()
{
int i=6;
try{
/* int n=10/0; */
System.out.println("try");
return 0;
}
catch (Exception ex)
{
System.out.println("catch");
return 1;
}
finally {
System.out.println("finally");
return 3;
}
}
会打印 finally...return=3;
但是下边这段代码:
static main(){
System.out.Println("main执行结果:"+temp());
}
static int temp()
{
int i=1;
try{
/* int n=10/0; */
System.out.println("try");
return i;
}
finally {
i++;
System.out.println("finally");
System.out.println(i);
}
}
结果为:try - finally - 2 main执行结果1 ,理论上讲 不是i不是2吗?为什么打印的main是1呢? 这就是保留返回值规则:先会把try或者catch代码块中的返回值保留,再来执行finally代码块中的语句,等到finally代码块执行完毕之后,在把之前保留的返回值给返回出去。但只适用于 return和throw语句,不适用于break和continue语句,因为它们根本就没有返回值。
5.假如上边例子改成这样:
static int temp()
{
int i=1;
try{
/* int n=10/0; */
System.out.println("try");
return i;
}
finally {
++i;
System.out.println("finally");
System.out.println(i);
return i;
}
}
又会打印 try - finally - 2 - main返回值为2,这回就对了,因为在finally中返回了i=2。
网友评论