黑马程序员技术交流社区

标题: io异常处理小问题 [打印本页]

作者: 涐扪①起奮乧    时间: 2013-11-8 17:09
标题: io异常处理小问题
本帖最后由 涐扪①起奮乧 于 2013-11-8 18:12 编辑
  1. import java.io.*;
  2. class FileWriteDemo
  3. {
  4.      public static void main(String[] args)

  5.                 {
  6.                          FileWriter fw = null;//?????fw放在这个位置,可以作用于整个函数,在外面建立引用,在try内进行初始化。
  7.                          try
  8.                          {
  9.                                 //fw = new FileWriter("D\\jdk\\java程序\\demo.text");//创建一个fw对象
  10.                                 fw = new FileWriter("D:\\jdk\\java程序\\demo.text");
  11.                                 fw.write("abcde");//写入数据
  12.                          }
  13.                          catch (IOException e)
  14.                          {
  15.                                 System.out.println(e.toString());
  16.                          }
  17.                          finally
  18.                          {
  19.                                  try
  20.                                  {
  21.                                         fw.close();//一定会执行的语句放在finally里面,但因为fw.close()会发生异常,所以这里单独try,catch一下。
  22.                                  }
  23.                                  catch (IOException e)
  24.                                  {
  25.                                          System.out.println(e.toString());
  26.                                  }

  27.                          }
  28.                 }
  29. }
复制代码
结果我是运行出来了,也看到了效果,有一点我有点不理解,就是
fw = new FileWriter("D:\\jdk\\java程序\\demo.text");这一行,在外面建立引用,在try里面创建对象,就本程序而言,try里面建立的对象fw是作用于了整个函数 。我能否这样理解对象不管在哪里创建都是作于整个函数,还是一些对象只能作用于局部?还请详细解释。
作者: 文涛    时间: 2013-11-8 17:59
首先,局部并不等同于函数,例如
for(int i=0;i<5;i++)
这个语句中,int i;i就是一个局部变量,在for完成以后,i就被销毁。如果你在这里定义一个对象,一样会被销毁。
而如果你在函数内部定义一个对象那么这个对象会在函数结束后被销毁,对象的作用域与生存周期与他定义的地点有关系,例如函数内部,for内部等等,与对象本身无关。
  对于你这个问题,你可以看到,try内部new了一个对象,并将引用赋值给fw,在这里,new FileWriter("D:\\jdk\\java程序\\demo.text");这个对象确实是个局部变量,他被定义在了try内部,于是在与她相同等级的局部final内是无法直接调用的,这点就好比你在一个函数中定义一个变量i,你在另一个函数中无法访问一样。
  所以这里要将该对象的引用fw定义在外部,这样fw这个引用就作用于整个函数,于是,final就能通过fw这个引用去访问局部的new FileWriter("D:\\jdk\\java程序\\demo.text");对象。
  引用就好像一个指针,这个指针定义在了函数内部,作用于了整个函数,而对象依旧是在try这个局部内,不过final利用这个指针去操作局部的内存空间,从而操作到了这个局部的对象,由此可见,在这里,并不是这个对象作用于整个函数,而是巧妙利用了fw引用(想象成指针)来操作局部对象
作者: 寻丶丶觅    时间: 2013-11-8 18:05
我的理解吧,对象你在哪里建立就在哪里有效,比如主函数里建立,就对主函数有效,如果该类有其他方法,你在其他方法里也不可能调用吧,在建立的方法中有效,这里建立在try里,是因为创建对象就要抛异常,而finally还需要对其需要执行关闭资源。如果直接try,fw引用有可能没有建立,fw.close()根本无法执行,还需要抛出新异常




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