A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姚伟涛 中级黑马   /  2012-4-24 10:56  /  2610 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class TestEx {
  2.         public  static  int test(int x){
  3.              int i=1;
  4.              try{
  5.                  System.out.println("try 块中 10/x之前");
  6.                  i = 10 /x;
  7.                  System.out.println("try 块中10/x之后");
  8.                  return i;
  9.              }catch(Exception e){
  10.                   i =100;
  11.                   System.out.println("catch块......");
  12.              }finally{
  13.                   i =1000;
  14.                   System.out.println("finally块");
  15.              }
  16.              return i;
  17.         }
  18.         public  static  void main(String avg[]){
  19.               System.out.println(TestEx.test(1));                    
  20.               System.out.println(TestEx.test(0));
  21.         }
  22. }
复制代码
结果:
try 块中 10/x之前
try 块中10/x之后
finally块
10
try 块中 10/x之前
catch块......
finally块
1000
运行顺序:
TestEx.test(1)先执行try中的语句,返回i的值为10,没有异常执行finally中的语句,由于finally中没有return,所以返回值依然是10
TestEx.test(0)先执行try中的语句,由于i=10/x;发生异常跳转到catch中执行语句,然后执行finally中的语句最终i=1000,由于catch和finally中都没有返回语句return,所以最终i=1000
不知道我的运行顺序对不对,不对求解释???

6 个回复

倒序浏览
本帖最后由 杨国祯 于 2012-4-24 12:00 编辑

这里面有几个特殊的情况!分别用代码表示,请注意,很容易混淆,
这里请注意补充的特殊情况,红字的return,这个地方很容易弄混!
public static int test(int x)
                        {
                                int i = 1;
                                try
                                        {
                                                System.out.println("try 块中 10/x之前"+ "i=" + i);
                                                i = 10 / x;                                                                   //到这里因为先执行 10/x,所以发生了错误,直接进入catch块中
                                                System.out.println("try 块中10/x之后"+ "i=" + i);
                                                return i;
                                        } catch (Exception e)
                                        {
                                                i = 100;
                                                System.out.println("catch块......"+ "i=" + i);
                                        } finally
                                        {
                                                i = 1000;
                                                System.out.println("finally块" + "i=" + i);                      //这里是总会执行的  i就变成了10000
                                        }
                                return i;
                        }

                public static void main(String avg[])
                        {
//                                System.out.println(TestEx.test(1));
                                System.out.println(TestEx.test(0));
                        }
补充1---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                catch (Exception e)
                                        {
                                                i = 100;
                                                System.out.println("catch块......"+ "i=" + i);
                                                return i;                                                                    //即使你把return移动到了这里,finally依然是会执行的,return的时候会检查有没有finally语句
                                                                                                                                  ,如果有,会执行执行finally中的语句,但因为return的是catch里面的i,所以值是100;

                                        } finally
                                        {
                                                i = 1000;
                                                System.out.println("finally块" + "i=" + i);                      //这里是总会执行的  i就变成了10000
                                        }
补充2---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                 catch (Exception e)
                                        {
                                                i = 100;
                                                System.out.println("catch块......"+ "i=" + i);
                                                return i;                                                            

                                        } finally
                                        {
                                                i = 1000;
                                                System.out.println("finally块" + "i=" + i);                      //这里是总会执行的  i就变成了10000
                                                return i;                                                                        //这里也有了一个return,怎么执行呢,很显然当执行catch语句中的return的时候执行了finally,但                             
                                                                                                                                    是我们允许finally直接返回,所以catch中的return就执行不到,i的结果也就是1000
                                        }  

这样的话我们就把finally和return的结果总结了,他们两个以后再见面,就水产了!哈哈~


回复 使用道具 举报
嗯、楼主i你的理解和我的一样的。
当你传1进去。   try里面先返回了10. 因为只可以有一条返回语句。末尾的returen不会执行直接跳过。
当你传0进去的时候。运行完 System.out.println("try 块中 10/x之前");  到i = 10 /x;就抛异常了。
  就到catch块。  最后return 1000
回复 使用道具 举报
杨国祯 发表于 2012-4-24 11:13
这里给楼主的还是一个分析问题的方法,多次实验时候就能发现正确的答案
public static int test(int x)
    ...

finally语句块的作用是无论出现什么情况,finally块中的语句一定会被执行,并且是在return之前执行。根据JAVA规范,如果try-finally或者catch-finally中都有return,则2个return都执行并最终返回调用者那里的是finally中的return,如果finally中没有return则返回的是catch中的return,但是finally中的代码也是要执行的。


网上这么说的
回复 使用道具 举报
姚伟涛 发表于 2012-4-24 11:26
finally语句块的作用是无论出现什么情况,finally块中的语句一定会被执行,并且是在return之前执行。根据 ...

你这个方法的return是一个很正常方法的return,正常的执行顺序,你这里不存在复杂的情况
回复 使用道具 举报
杨国祯 发表于 2012-4-24 11:38
你这个方法的return是一个很正常方法的return,正常的执行顺序,你这里不存在复杂的情况 ...

我知道,这是网上档来的
回复 使用道具 举报
您的程序结果为:


程序分析:
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马