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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 梦想蓝色天空 于 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.

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

11 个回复

倒序浏览
gulup 来自手机 中级黑马 2013-8-21 12:35:19
沙发
finally是最后执行的,不是先执行的,例如编写io操作的代码的时候,异常处理都应该写上finally,用于关闭流对象,适当占用资源。如果finally是先执行的话,流都被关了,还怎么操作数据?对吧。
回复 使用道具 举报
gulup 来自手机 中级黑马 2013-8-21 12:35:54
藤椅
上面写错了,不是适当占用资源,是释放。
回复 使用道具 举报
是先执行return的,这个可以用来检验return和fially的执行顺序,好像有个基础测试就是这么做的
回复 使用道具 举报
        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 12:48
static int Test() {
                  int i = 1;
                  try {

上面的执行顺序
  先执行finnaly 在finnaly里面不是已经把值++i  改变了吗。那么try里面的return怎么还是1呢
回复 使用道具 举报
gulup 发表于 2013-8-21 12:35
finally是最后执行的,不是先执行的,例如编写io操作的代码的时候,异常处理都应该写上finally,用于关闭流对象 ...

可是我在try里面有个return 。。这样的话就是执行完finnally里面再执行return的呀。
回复 使用道具 举报
try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容
}
catch
{
//除非try里面执行代码发生了异常,否则这里的代码不会执行
}
finally
{
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally  如果try里有异常,那么finally里也会出现异常了,可以理解finally执行的代码和try里执行的代码没有关系。
}
回复 使用道具 举报
一个铃,一颗珠 发表于 2013-8-21 13:23
try
{
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 ...

嗯。这些我都明白

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

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

再看程序中  我定义成员变量i     在finnlly里面++i   但在return 之后i的值没有被++i。。。这是什么原因
回复 使用道具 举报
return i 这句的意思可以分成两个:1.把i的值返回。2.跳出当前函数。
finally是在1和2之间执行的。return句会把返回值复制一份出来暂存到别处,然后去执行finally,finally这时候再操作原来的i就没意义了。除非finally操作完之后再重新return一次,这样原来暂存的那个值会被覆盖。

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1 勇士准备好追寻你的技术分了吗?.

查看全部评分

回复 使用道具 举报
yangjie 发表于 2013-8-21 15:01
return i 这句的意思可以分成两个:1.把i的值返回。2.跳出当前函数。
finally是在1和2之间执行的。return句 ...

嗯。。原来是这样。。讲的很能明白。。非常感谢{:soso_e121:}
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马