黑马程序员技术交流社区

标题: return 和finnaly在一个方法执行的时候,值不会变 [打印本页]

作者: 梦想蓝色天空    时间: 2013-8-21 12:25
标题: return 和finnaly在一个方法执行的时候,值不会变
本帖最后由 梦想蓝色天空 于 2013-8-21 15:06 编辑

之前自己学过JAVA基础。。现在重新看一下黑马的基础视频。但是还是发现自己有不少问题需要补足
就下面这个问题请教大家。
static int Test() {
  int i = 1;
  try {
   System.out.println(i);
   return i;
  } finally {
   ++i;
  }
}
public static void main(String[] args) {
  System.out.println(Test());
}


很简单的程序。按照执行顺序不是先执行Test()方法里面的finnaly再执行try里面的return吗。。为什么打印值是1.而不是finnaly里面++i后的2.

作者: gulup    时间: 2013-8-21 12:35
finally是最后执行的,不是先执行的,例如编写io操作的代码的时候,异常处理都应该写上finally,用于关闭流对象,适当占用资源。如果finally是先执行的话,流都被关了,还怎么操作数据?对吧。
作者: gulup    时间: 2013-8-21 12:35
上面写错了,不是适当占用资源,是释放。
作者: 会飞的狼    时间: 2013-8-21 12:40
是先执行return的,这个可以用来检验return和fially的执行顺序,好像有个基础测试就是这么做的
作者: 一个铃,一颗珠    时间: 2013-8-21 12:48
        static int Test() {
                  int i = 1;
                  try {
                   System.out.println(i);
                   return i;
                  } finally {
                          System.out.println(++i); ;
                  }
                }
        public static void main(String[] args) {
                System.out.println(Test());
        }
打印的结果:
1
2
1
所以finnaly是表示最后一定会执行的代码
作者: 梦想蓝色天空    时间: 2013-8-21 13:03
一个铃,一颗珠 发表于 2013-8-21 12:48
static int Test() {
                  int i = 1;
                  try {

上面的执行顺序
  先执行finnaly 在finnaly里面不是已经把值++i  改变了吗。那么try里面的return怎么还是1呢

作者: 梦想蓝色天空    时间: 2013-8-21 13:04
gulup 发表于 2013-8-21 12:35
finally是最后执行的,不是先执行的,例如编写io操作的代码的时候,异常处理都应该写上finally,用于关闭流对象 ...

可是我在try里面有个return 。。这样的话就是执行完finnally里面再执行return的呀。

作者: 一个铃,一颗珠    时间: 2013-8-21 13:23
try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally  如果try里有异常,那么finally里也会出现异常了,可以理解finally执行的代码和try里执行的代码没有关系。
}

作者: 梦想蓝色天空    时间: 2013-8-21 13:39
一个铃,一颗珠 发表于 2013-8-21 13:23
try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 ...

嗯。这些我都明白

如果一个模块中有try{...这里面有return}catch{}finnaly{}

如果try里面有return 并且有finnaly{}那么会先执行finnlly最后执行return

再看程序中  我定义成员变量i     在finnlly里面++i   但在return 之后i的值没有被++i。。。这是什么原因

作者: yangjie    时间: 2013-8-21 15:01
return i 这句的意思可以分成两个:1.把i的值返回。2.跳出当前函数。
finally是在1和2之间执行的。return句会把返回值复制一份出来暂存到别处,然后去执行finally,finally这时候再操作原来的i就没意义了。除非finally操作完之后再重新return一次,这样原来暂存的那个值会被覆盖。
作者: 梦想蓝色天空    时间: 2013-8-21 15:06
yangjie 发表于 2013-8-21 15:01
return i 这句的意思可以分成两个:1.把i的值返回。2.跳出当前函数。
finally是在1和2之间执行的。return句 ...

嗯。。原来是这样。。讲的很能明白。。非常感谢{:soso_e121:}

作者: 龚首道    时间: 2013-8-21 15:33
  1. public class Test5 {

  2.         *//**
  3.          * 第五题:用代码证明,在try中写了return,后面又写了finally,是先执行return还是先执行fianlly?
  4.          * @author Administrator
  5.          *//*
  6.         public static void main(String[] args) {
  7.                 //输出结果为2、8,证明先执行了finally,后执行return
  8.                 System.out.println(tryFinallyTest(4));
  9.                
  10.                 //程序运行后先打印“finally:2”,后输出8。证明先执行finally,后执行return。
  11.         }
  12.         public static int tryFinallyTest(int n)
  13.         {
  14.                 try
  15.                 {
  16.                         int num = n+n;
  17.                         return num;
  18.                 }
  19.                 finally
  20.                 {
  21.                         System.out.println("finally:2");
  22.                 }
  23.                
  24.         }
  25. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2