java 异常处理中finally语句块的一点小问题

kong_resty 发布于 2012/03/12 14:29
阅读 876
收藏 0
package Ztest;

public class Test {
 public static void main(String[] args) {
  ExceptionTest et = new ExceptionTest();
  System.out.println(et.test());
 }
}

class ExceptionTest{
 public int test(){
  int i =2;
  try{
   System.out.println(i/0);
  }catch(Exception e){
   return  i;
  }finally{
   i++;
   System.out.println("执行finally");
  }
  return i;
 }
}

运行结果:

执行finally
2   

 

在这个问题出现之前: 我理解异常处理顺序是这样的: try 代码块,当try代码块执行出现异常时

执行catch块 如果catch没有return语句,然后再执行finally块,假如catch代码块有return语句

那么会直接跳转到 finally语句 执行完之后 继续执行 catch return代码块。

按照我的理解以上程序执行结果应该是

执行finally
3

可是现在这结果又点让我犯晕啊。求指教???

 public int test(){
  int i =2;
  try{
   System.out.println(i/0);
  }catch(Exception e){
   return  i;
  }finally{
   i++;
   return i;
  }
 }

假如我将test方法改变成如上运行结果:3

对以上又怎么理解??

我的理解是:遇上catch return 语句执行就去了finally 语句了 finally语句直接return了。

加载中
0
10书生
10书生

首先建议不要在catch或者finally块中有return语句;

其次建议finally块中主要进行资源清理类操作;

最后,可以阅读下该文章http://www.ibm.com/developerworks/cn/java/j-lo-finally/

1
Klingon
Klingon

引用来自“黄龍”的答案

我理解是catch中return时已经把i的值记录下来了,等执行完finally方法后再返回.所以finally的赋值没有效果.

" return时已经把i的值记录下来了"

Return的语句在catch中先执行,完事把返回值放到临时区域内,执行finally代码块遇到}后将临时区域的值返回给上级程序,也就是main中的println语句。第二个代码中finally代码中有return语句,覆盖了临时区域。

0
喜之郎
喜之郎
Step Over一下呀。
0
kong_resty
kong_resty

不行啊  step Over是按我的理解运行的啊

0
黄龍
黄龍
我理解是catch中return时已经把i的值记录下来了,等执行完finally方法后再返回.所以finally的赋值没有效果.
返回顶部
顶部