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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵然 中级黑马   /  2013-5-3 20:53  /  3066 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵然 于 2013-5-3 23:30 编辑

package com.itheima;
class FinRe
{
        public static int getNum()
        {
                int num = 1;//定义一个值 以对其进行操作来展示其值来
                try
                {
                        System.out.println("要返回的num的值是:"+num);
                        return num;//return一个值
                }
                finally //finally操作
                {
                        num = 0;//对num进行改变
                        System.out.println("Finally中num="+num);
                        /*
                          如果finally中有return,则返回的是这个值 这样finally就会改变原本要返回的属性的值,
                         也就是说得不到预期的值了,即finally改变了所需返回return的结果。
                        */
                        //return num;
                }        
        }        
        public static void main(String[] args)
        {
                System.out.println("num = "+getNum());
        }
}
虽然可以证明fianlly在程序中先于return 执行 但是却推翻了finally 不能改变return 的值。这个问题纠结了。与此同时我又郁闷了两个返回值,虚拟机是怎么处理的,为什么没有神经错乱直接编译失败或者这种返回值覆盖算不算是一个bug——类似于finally直接“吃掉了”前面代码。当然如果这种思路,这段代码原本就有问题还请大神们给提出来,先谢过!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

12 个回复

倒序浏览
本帖最后由 殇_心。 于 2013-5-3 21:12 编辑

这个问题当初我理解错了。
现在的话也是半知半解吧。
我的理解是:
try里面一个return m;// 此时在转到finally之前。把m存入了一个临时变量中。
finally中有一个return m;//此时会覆盖try中return值。返回一个新值m。
如果finally中没有return。在finnally结束之后。会返回临时变量中存储的m值。
不建议在finally中写return。因为会导致catch里throw的异常丢失。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
看代码吧
  1. class Fin
  2. {
  3.         public static int getNum()
  4.         {
  5.                 try
  6.                 {
  7.                         System.out.println("try");
  8.                         return 5;
  9.                 }
  10.                 finally
  11.                 {
  12.                         System.out.println("finally");
  13.                         System.out.println(6);
  14.                 }
  15.         }
  16. }
  17. public class Test{
  18.         public static void main(String[] arg)
  19.         {
  20.                 System.out.println(Fin.getNum());
  21.         }
  22.        
  23. }
复制代码
回复 使用道具 举报
尹桥印 发表于 2013-5-3 21:11
两个问题:
1.你说finally先于return执行,也就是先执行finally,不管里面有没有返回值,执行之后必须还要 ...

就是说finally不会改变最后一个执行的return的值 是么
回复 使用道具 举报
殇_心。 发表于 2013-5-3 21:11
这个问题当初我理解错了。
现在的话也是半知半解吧。
我的理解是:

如果finally中没有return的话是不是try中的执行到return前的时候直接跳出执行finally中代码,之后再返回try继续执行return?如果finally中有return的话,直接执行finally中的return结束程序?
回复 使用道具 举报
尹桥印 发表于 2013-5-3 22:30
如果你觉得我分析得正确的话,那就是finally不会改变return的值

我是这么想的:如果finally中有return的话就直接执行其中的return了 这样子就结束了。
回复 使用道具 举报
不如自己制造个异常,然后在catch里面return ,然后在filally里面修改retuen 的值,这不就完结了?
public class Text5 {

public static void main(String[] args)
{
  int i = 0;
  i = returnAndFinally();

System.out.println("返回值:"+i);
  
}

public static int returnAndFinally()
{
  int num =5;
  try
  {
   num = num/0;
  }
  catch(Exception e)
  {
   return num;
  }
  finally
  {
   num = 100;
   System.out.println("finally被执行并且修改num值num = 100");
   
   
  }
  return 0 ;
}
}
回复 使用道具 举报
本帖最后由 xuluheng718 于 2013-5-3 23:25 编辑

其实,你这个应该是没什么问题,其实你的程序中finally里面修改的是num值,并不是返回值,你的这个返回值一样是1
并没有在num中被修改成0

要明白finally里面,不管多少语句或者代码块,都会被执行,它当然能在finally里面修改数据,但是不能修改返回值而已

就比如,捕获了一个异常,而这个异常的处理方式是返回当前发生异常的数值,而当代码出现异常,这个数值必须被重置

假如在fianlly中能够修改此返回值,不觉得很可怕么?那么次异常就相当于没异常。,
回复 使用道具 举报
这个不是之前的面试题吗!
回复 使用道具 举报
public class Test1{  
  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub   
        System.out.println(prove());  
    }  
      
    public static int prove(){  
        int i = 0;  
        try{      
            i++;  
            return i/0;  
        }catch (Exception e){  
            e.printStackTrace();  
        }finally{  
            i=100;  
            try {  
                Thread.sleep(1000);//让线程sleep 1秒   
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            System.out.println("此处内容先输出");   
        }  
        return i/0;  
    }  
}  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马