黑马程序员技术交流社区

标题: 学IO流的碰到一点小疑问 [打印本页]

作者: lwy0319    时间: 2014-3-24 03:33
标题: 学IO流的碰到一点小疑问
本帖最后由 lwy0319 于 2014-4-1 02:17 编辑

       今天初学IO时发现throws IOException时需要导入IO包,因为之前才过异常,发现之前不涉及到导包,然后又回去查了Throwable类发现他在java.lang包里,又在里面发现了不少常用类和语句,看来这个包不用特意导入,想知道IO异常这种虽然属于Throwable类但是确跟Throwable类不在一个包里的现象多么?除了lang包已经默认加载(本人猜的),还有哪些包是默认加载的?
       还有就是看到毕老师的视频中讲关于用FileWriter类构造方法的例子中首先在try之外用FileWriter f= null;以备finally中用实例对象f执行关闭流的操作,如果把FileWriter f=new FileWriter("d:\\test.txt");整个放在try里,会造成如果创建错误,而f没被成功创建,则无法关闭流,因为我是初学,所以没搞明白如果f没被创建,那开启什么东西了么?(比如流),是否有需要关闭资源的必要,个人感觉好像没诞生什么东西。。PS:看毕老师视频时他经常问听懂了没?我总想回答没懂。。。
作者: 凝霜的枯藤    时间: 2014-3-24 14:22
1.第一个问题可以查一下JDK API中文版,自己查证一下吧.默认的话只有java.lang.*中类被加载.
2.如果FileWriter f = new FileWriter("d:\\test.txt")即声明在try-catch语句块里,只能作为这个代码块的局部变量.它的作用范围就只能在try-catch域中,一般我们关闭资源都在finally语句执行,所以就不能使用引用f.--->简单来讲就是引用f是局部变量.所以你不能在finally调用f.
加油!!!哥们
作者: 李东梁    时间: 2014-3-24 14:52
1. 其实学到后面用eclipse时,导包什么的,都会提示,快捷键Shift+Ctrl+O导入所需的快捷键,再有报错,再分析程序有无别的错误(注意,对导包也要有一定的概念了解),多看看 API文档吧。。

2. try {   }finally{ }也是一个代码块,注意变量的有效范围
作者: lwy0319    时间: 2014-3-24 14:52
呃。。一起加油。。我的意思是f如果没被成功创建有没有必要执行f.close()。。感觉没开流,不知道有没有必要关掉。。
作者: 亓华森    时间: 2014-3-31 11:40
亲,你猜对了!确实.lang包是默认加载,并且只有这一个包是默认加载的!
以你说的FileWriter f=new FileWriter("d:\\test.txt");为例,如果d盘不存在,那么这条语句在逻辑上是有问题的,但是编译器并不会发现这一异常,可照常编译。这也正是需要我们处理异常的原因。
“而f没被成功创建,则无法关闭流,因为我是初学,所以没搞明白如果f没被创建,那开启什么东西了么?”流本质上就是一段有序的数据,占用的是内存。
“如果把FileWriter f=new FileWriter("d:\\test.txt");整个放在try里“,这种情况下应该在catch或之后的语句中释放内存。
这是我的理解,希望能帮到你~

作者: 蒋珍珍    时间: 2014-3-31 13:46
         正因为我们不知道流是否创建成功,所以需要最后来判断流是否为null,如果不为null,我们就关闭流。如果为null,肯定就不用执行了。其实关闭语句是否成功执行,也是不确定的,也需要try。
流加载文件的时候一般用File类先封装好这个文件比较妥当。
最后,文件不存在,就会抛出FileNotFoundException,流肯定是不会创建成功




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