| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1037 人关注过本帖
标题:诡异的finally
只看楼主 加入收藏
dgaowyuan123
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-7-14
结帖率:66.67%
收藏
已结贴  问题点数:10 回复次数:17 
诡异的finally
碰到这样一个程序:package com.whpu.test.w716;

import
import
import

public class FinallyDemo {

    public String getValue(){
        String msg = "ok";
        try {
            FileInputStream fin = new FileInputStream("d:/a.txt");//有a.txt此此文件
            fin.read();
            return msg;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            msg = "finally";
            System.out.println("我被调用");
        }
        
        return msg;
    }
   
   
    public static void main(String[] args) {
        FinallyDemo f = new FinallyDemo();
        System.out.println(f.getValue());
    }

}
输出结果为:
我被调用
ok
//本人不解,请大虾解释下
搜索更多相关主题的帖子: finally 
2010-07-16 13:34
lampeter123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:54
帖 子:2508
专家分:6424
注 册:2009-1-30
收藏
得分:2 
如果finally语句中没有return语句覆盖的话,那么先执行try 的return 后执行finally

你的优秀和我的人生无关!!!!
    
    我要过的,是属于我自己的生活~~~
2010-07-16 15:28
dgaowyuan123
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-7-14
收藏
得分:0 
回复 2楼 lampeter123
能不能说的详细的呢?
2010-07-16 20:37
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:2 
finally块总是会被执行的!!!

★★★★★为人民服务★★★★★
2010-07-16 20:43
dgaowyuan123
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-7-14
收藏
得分:0 
那么msg的值就应该是  finally啊,可是打印出来的结果是  ok
2010-07-18 11:29
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
只有return 才会返回值啊!

★★★★★为人民服务★★★★★
2010-07-18 14:58
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
收藏
得分:2 
程序执行到try中的return时,虽然没有执行,但是已经执行了return后面的msg,也就是说,不管finally中再对msg做什么变化,只要finally执行完了再回来执行try的return,返回的msg是执行finally之前的值,如果把return后面的msg改为方法,看着就更直观了,如下:
程序代码:
import import import public class FinallyDemo {
    static String msg = "ok";
    public static String one(){
        System.out.println("one");
        return msg+" "+"one";
    }
    public String getValue(){
      
        try {
            FileInputStream fin = new FileInputStream("d:/a.txt");//有a.txt此此文件
            fin.read();
            return one();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            msg = "finally";
            System.out.println("我被调用");
        }
     
        return msg;
    }


    public static void main(String[] args) {
        FinallyDemo f = new FinallyDemo();
        System.out.println(f.getValue());
    }
}
输出结果是:
one
我被调用
ok one
//程序执行到try的return的时候虽然没有执行,但是return后面的方法(你程序里是msg字符串)却执行了,后面再对它做修改也不会影响它的值

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-07-18 16:21
lampeter123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:54
帖 子:2508
专家分:6424
注 册:2009-1-30
收藏
得分:0 
如果return msg;在finally里面,就会返回msg="finally", 复盖之前的try return

你的优秀和我的人生无关!!!!
    
    我要过的,是属于我自己的生活~~~
2010-07-19 08:04
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:2 
finally块总是会被执行的,不管程序抛出异常还是正常运行,finally一定能执行。所以在调用getValue()的时候,
返回了ok,并且执行System.out.println("我被调用");所以输出 我被调用。程序中又把返回结果打印出来
System.out.println(f.getValue());
所以再输出ok了。
2010-07-19 09:50
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:0 
回复 7楼 syg5434
程序代码:
public class FinallyDemo {
    static String msg = "ok";

    public static String one() {
        System.out.println("one");
        return msg + " " + "one";
    }

    public String getValue() {

        try {
            // FileInputStream fin = new
            // FileInputStream("d:/a.txt");//有a.txt此此文件
            // fin.read();
            return one();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            msg = "finally";
            System.out.println("我被调用");
        }

        return msg;
    }

    public static void main(String[] args) {
        FinallyDemo f = new FinallyDemo();
        System.out.println(f.getValue());
        System.out.println(f.msg);
    }
}

你输出getVaule();return one();当时finally还没被执行,msg = "ok";
再写个输出语句System.out.println(f.msg);
你就可以清楚的看到,msg被改变了
2010-07-19 09:53
快速回复:诡异的finally
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.069835 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved