问题描述
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 blocke.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();}finally{if(fis!=null){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)
解决方案二:
首先 ,你的代码有问题。因为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。
解决方案三:
if(fis!=null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } 不加也无所谓 加上的目的是如果打开时出问题 此时为null 就没必要再让它抛空指针了 性能比没有判断要好点
解决方案四:
不理解你为什么会不理解?finally这里就是要确保流能够被正确关闭。有两种可能1. fis打开了即非空,那么就必须关闭。2. fis根本就没打开即为null,那么就可以无视了。
解决方案五:
这里主要是确保释放资源的问题,这里fis不可能为空的,要是为空的话,则说明文件读取不到,也就是会IOException,结果可能是文件读取不到或者是其它问题导致的。程序根本不会执行的。