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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐僧踏歌 中级黑马   /  2014-4-2 13:14  /  1361 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐僧踏歌 于 2014-4-4 12:08 编辑

public class Test1{
         static int v;
        public static void main(String[] args)
        {
               
                Test1 man=new Test1();
                v=man.test();
                System.out.println("最终的v值="+v);
        }
        public  int test()
        {   int a=0;
                try{a=1/0;}
            catch(ArithmeticException e)
            {
                    a=2;
                    return a;
            }        
                finally
                {
                        System.out.println("在finally的v值="+v);

                }
                a=3;       //为什么以下这两句对v的终值没点影响?
      return a;    //
        }

}
/*
结果是这样的:

在finally的v值=0
最终的v值=2

*/

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

14 个回复

倒序浏览
return 是用来结束函数用的,当都到return的时候,其实函数就要结束!..
但是finally的特点就是 没有System.exit(0)的情况,必然会运行.
所以又在函数结束前运行一次finally...但是重点是return语句已经读过了!!!!

点评

哈哈,这个解释行得通,亮点是后面的四个感叹号。谢谢  发表于 2014-4-4 07:57

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
结果解释在代码里  希望有帮助!!

  1. public class Test1{
  2.          static int v;
  3.         public static void main(String[] args)
  4.         {
  5.                
  6.                 Test1 man=new Test1();
  7.                 v=man.test();
  8.                 System.out.println("最终的v值="+v);
  9.         }
  10.         public  int test()
  11.         {   int a=0;
  12.                 try{a=1/0;}
  13.             catch(ArithmeticException e)
  14.             {
  15.                     a=2;
  16.                     return a;
  17.             }        
  18.                 finally
  19.                 {
  20.                         System.out.println("在finally的v值="+v);

  21.                 }
  22.                 a=3;       //为什么以下这两句对v的终值没点影响?
  23.       return a;    //
  24.         }

  25. }
  26. /*
  27. 结果是这样的:

  28. 在finally的v值=0
  29. 最终的v值=2
  30. 因为  try{a=1/0;}这句话会产生异常,执行 catch(ArithmeticException e)代码块,
  31. 里边有 return a;  而return的时候会查看一下有没有finally代码块,
  32. 有的话先执行finally,没有的话函数直接结束。不会执行a=3;和 函数外return a;两句。
  33. 执行finally时,返回V,是返回的全局变量,所以是0
  34. */
复制代码



评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报 0 1
Up↑Lee↗ 发表于 2014-4-2 13:28
结果解释在代码里  希望有帮助!!

有的话先执行finally,没有的话函数直接结束。     //无论没有没有没有他都会先执行catch后执行finally
回复 使用道具 举报
  1. public class Test1{
  2.         static int v;
  3.     public static void main(String[] args)
  4.     {
  5.                 Test1 man=new Test1();
  6.         v=man.test();
  7.         System.out.println("最终的v值="+v);
  8.     }
  9.     public int test()
  10.     {
  11.                 int a=0;
  12.         try{
  13.                         a=1/0;
  14.                 }catch(ArithmeticException e){
  15.                         a=2;
  16.                         System.out.println("我是第一个执行的!") ;
  17.             return a;
  18.         }finally{
  19.                         System.out.println("在finally的v值="+v);
  20.                 }
  21.         a=3;       //为什么以下这两句对v的终值没点影响?
  22.                 return a;    //因为它前面已经执行过了return了
  23.     }

  24. }
  25. /**
  26. * 程序执行到a=1/0;时,发现了异常,然后就要去执行catch中的语句,
  27. * 但是catch中有了return语句,所以程序就结束了,但是finally是
  28. * 异常的统一出口,所以当程序被return后还会去执行finally,除非
  29. * 在catch中使用System.exit(0)终止了Java虚拟机。
  30. * @return
  31. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
王峰峰 发表于 2014-4-2 14:12
有的话先执行finally,没有的话函数直接结束。     //无论没有没有没有他都会先执行catch后执行finally ...

有什么不对么
回复 使用道具 举报
懂了一点
回复 使用道具 举报
本帖最后由 Peach2014 于 2014-4-2 15:44 编辑

首先你必须了解一下几点:
       1.一个函数只会返回一次值(可以简单的理解为”return“就是函数的出口,出来之后就结束了)

       2.int类型的静态变量如果不指定初始化值,默认赋值为0

       3.finally{}中的代码,除非程序出现RuntimeException异常,否则其中的代码必然会执行

然后分析一下你的代码:
       在”try{a=1/0;}“中出现ArithmeticException 异常,被catch捕获,执行catch中的语句,此时a=2,返回值为2,参照上述第1点,函数应该结束;
       但是JVM发现还有finally关键字,所以它进入finally{}中执行“System.out.println("在finally的v值="+v);”参照上面的第2点,所以输出“在finally的v值=0”;至此函数不会继续执行下去,所以“a=3;       //为什么以下这两句对v的终值没点影响?”这段代码不会被执行。
    “v=man.test();”此时v=2,所以输出“最终的v值=2”


评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
  1. public class text7 {
  2.       static int i =2;
  3.         public static void main(String[] args) {
  4.                 System.out.println(get());
  5.                 //finally虽然是最后执行的,但是比return与try中的return优先返回值
  6.                 System.out.println(i);
  7.                 }
  8.                 public static int get(){
  9.                 try{
  10.                         System.out.println(i);
  11.                 return (i=1);
  12.                 }catch (Exception e) {
  13.                 }finally{
  14.                 System.out.println(i = 6);
  15.                 return 8;  //优先执行finally   return将在函数结束后返回     至于你catch里面什么结果,finally是不管你的
  16.                 }
  17.                 //return i = 9;  不会被执行
  18.                 }

  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
try{a=1/0;} 是一个异常 在java中 0是不能作为被除数。当try后,会执行 catch 中的语句 a就等于2 同时将a的值返回,赋予v 。 结果在catch时就已经返回,所以下面的语句都不会再继续执行
回复 使用道具 举报
本帖最后由 唐僧踏歌 于 2014-4-4 08:00 编辑
Up↑Lee↗ 发表于 2014-4-2 13:28
结果解释在代码里  希望有帮助!!


亲,最下面两句也不是在函数外啊,我在书上看到的是,finally结束后,该函数后面还有语句,那后面还得执行的啊
回复 使用道具 举报
唐僧踏歌 发表于 2014-4-4 07:53
亲,最下面两句也不是在函数外啊,我在书上看到的是,finally结束后,该函数后面还有语句,那后面还得执 ...

大哥   你catch里边有return语句了好吧!执行了这个return。在执行finally  剩下的就不会执行了

点评

恩恩,前面看到有个同学解释了。谢谢  发表于 2014-4-4 08:40
回复 使用道具 举报
return 是用来结束函数用的,当都到return的时候,其实函数就要结束!..
但是finally的特点就是 没有System.exit(0)的情况,必然会运行.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马