java中IO流关闭时的疑惑
InputStreamin=null;try{in=newFileInputStream("t.txt");//...............IO操作}finally{/...
InputStream in = null;
try {
in = new FileInputStream("t.txt");
// ...............IO操作
} finally { //**********
if(in != null){
try {
in.close();
}catch(IOException e) {
//.....
}finally {
in = null; //疑惑处
}
}
}
各位觉得最后出异常时把in = null有意义么?
如果有意义的话,那我们直接在//**********
就把in=null就可以了,何必再in.close()来捕获异常再in=null?
或者说in=null有没有把系统资源给回收起来?
最后再问一下in.close()出异常的时候,虚拟机把系统资源回收起来了没?
大家一起说说自己的看法吧
不好意思各位,迟些了答复。。
还是把题目说清楚吧
public void copyfile(){ //复制文件的方法
//上面贴的那一段
}
问题作用域只是对这个方法来讨论。
现在有点眉目了,还是照j2ee-sun所说的那样,不管出异常了没有,始终在最后的finally块中in=null,这样总会是相对完美的 展开
try {
in = new FileInputStream("t.txt");
// ...............IO操作
} finally { //**********
if(in != null){
try {
in.close();
}catch(IOException e) {
//.....
}finally {
in = null; //疑惑处
}
}
}
各位觉得最后出异常时把in = null有意义么?
如果有意义的话,那我们直接在//**********
就把in=null就可以了,何必再in.close()来捕获异常再in=null?
或者说in=null有没有把系统资源给回收起来?
最后再问一下in.close()出异常的时候,虚拟机把系统资源回收起来了没?
大家一起说说自己的看法吧
不好意思各位,迟些了答复。。
还是把题目说清楚吧
public void copyfile(){ //复制文件的方法
//上面贴的那一段
}
问题作用域只是对这个方法来讨论。
现在有点眉目了,还是照j2ee-sun所说的那样,不管出异常了没有,始终在最后的finally块中in=null,这样总会是相对完美的 展开
5个回答
2015-12-07 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 加入异常处理的字节输出流操作
*/
public class FileOutputStreamDemo4 {
public static void main(String[] args) {
// 分开做异常处理
// FileOutputStream fos = null;
// try {
// fos = new FileOutputStream("fos4.txt");
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// }
//
// try {
// fos.write("java".getBytes());
// } catch (IOException e) {
// e.printStackTrace();
// }
//
// try {
// fos.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// 一起做异常处理
// try {
// FileOutputStream fos = new FileOutputStream("fos4.txt");
// fos.write("java".getBytes());
// fos.close();
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
// 改进版
// 为了在finally里面能够看到该对象就必须定义到外面,为了访问不出问题,还必须给初始化值
FileOutputStream fos = null;
try {
// fos = new FileOutputStream("z:\\fos4.txt");
fos = new FileOutputStream("fos4.txt");
fos.write("java".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 如果fos不是null,才需要close()
if (fos != null) {
// 为了保证close()一定会执行,就放到这里了
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
展开全部
如果:InputStream in = null;的声明是在方法的里面,而且,在finally后面没有什么代码的话,finally中的in = null可以不需要
如果finally后面还有很多的代码的话,此处使用in = null可以告诉JVM,new FileInputStream("t.txt");实例化后的对象可以被回收了,而没有这个语句的话,则只有在InputStream in的作用域结束后才可能被JVM回收
如果finally后面还有很多的代码的话,此处使用in = null可以告诉JVM,new FileInputStream("t.txt");实例化后的对象可以被回收了,而没有这个语句的话,则只有在InputStream in的作用域结束后才可能被JVM回收
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先 这段代码写的就不规范
1、去看下api查下try catch finally的用法
2、FileInputStream 在执行完之后一定要置为空 具体看下API
1、去看下api查下try catch finally的用法
2、FileInputStream 在执行完之后一定要置为空 具体看下API
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果保持in的引用,而其他可执行代码区又可见in的话,引用in所指的对象不会被销毁
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接close就好了,in=null,告诉jvm,可回收
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询