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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王得新 中级黑马   /  2012-10-13 16:36  /  1460 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王得新 于 2012-10-14 17:51 编辑

一直没注意到这个问题,突然意识到的,求解释:
class  IoException
{
    public static void main(String[] args)
    {
        FileWriter file=null;//2.在这里先声明,这时file就就会作用于整个函数
        try{
            //FileWriter file=new FileWriter("demo.txt");//1 这样写是不对的,因为file实在try代码块中声明的,那么在finally的代码块中就访问不到,
                                                               //
也就是说file.close()关闭不了,得在步骤 2处先声明
            file=new FileWriter("demo.txt");
            file.write("aaaaaaaaaaaa");


        }catch(IOException e){
        
            System.out.println(e.toString());


        }finally{
        
            try{
                if(file!=null)//3 问题来了,既然file是在try块中进行实例化的,是不是file的作用范围就在try块中?那么在这里file是不是还是null,
                {              //
如果是null的话,那么file就没有实例化,没有实例化的file是不能调用close()的。
                                //(我想这里的file应该是实例化的,但是我就是理解不了,望黑马能解释下!)

                    file.close();
                }
            
            }catch(IOException e){
        
            System.out.println(e.toString());

            }
        }
        
        

    }
}

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 官仁杰 于 2012-10-13 16:59 编辑

file是一个引用,这个引用是在程序最外层声明的。然后在第一个try代码块,这个引用实例化了。file指向了某个具体的对象。这种指向不会随着try代码块的结束而结束。
你可以这么理解
i =0;
try{
i =1;
}
System.out.println(i);
这时候i是1,这是一个类比。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 赞一个!

查看全部评分

回复 使用道具 举报
注意变量的使用范围。
file已经在方法中声明,那么在它之后的代码对它的操作都是有效的。
所有try{}  中
   new FileWriter(文件路径)  若此处无异常,则file被实例化
回复 使用道具 举报
变量声明在哪里,作用范围就在哪里。
实例化的位置并不能左右变量的作用范围。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马