public class Test_01 {
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis=new FileInputStream("D:\\workspace\\TestIO\\src\\TestTO_01\\TestFile.java");
byte[] buf=new byte[1024];
int c=0;
try {
while((c=fis.read(buf))>=0){
System.out.write(buf);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
finally{
[color=red]if(fis!=null)[/color]{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
红色的这个地方不能理解 fis不等于空? 然后又调用close来关闭这个流
假设fis等于空怎么办? 求解!
你把文件路径:D:\workspace\TestIO\src\TestTO_01\TestFile.java改为一个不存在的路径,即:D:\workspace\TestIO\src\TestTO_01\TestFile111.java
然后执行这段代码,你就会发现程序抛出:FileNotFoundException这个异常,但此时fis为null,而你的finally里面如果不对fis判断是否为空,则会抛出java.lang.NullPointerException异常。所以需要你在close之前,再增加判断语句:if(fis!=null)
这里主要是确保释放资源的问题,这里fis不可能为空的,要是为空的话,则说明文件读取不到,也就是会IOException,结果可能是文件读取不到或者是其它问题导致的。程序根本不会执行的。
不理解你为什么会不理解?
finally这里就是要确保流能够被正确关闭。
有两种可能
fis打开了即非空,那么就必须关闭。
fis根本就没打开即为null,那么就可以无视了。
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
不加也无所谓 加上的目的是如果打开时出问题 此时为null 就没必要再让它抛空指针了 性能比没有判断要好点
首先 ,你的代码有问题。
因为FileNotFoundException继承了IOException,所以catch (FileNotFoundException e)
应该在catch (IOException e) 前。
其次,fis == null 的情况是在 运行到
new FileInputStream("D:\workspace\TestIO\src\TestTO_01\TestFile.java")
时发生 FileNotFoundException。
这样fis就没有被赋值。
这时,如果finally块中直接执行fis.close,就会出现NullException
如果是运行到 fis.read时,抛出IOException,则 null != fis。