Java的file.close()放在finally代码块报错

在学习 Java 的 IO 部分时有如下代码:

import java.io.*;
public class InputFile {
    public static void main(String [] args){
        int a = 0;
        FileInputStream file = null;
        try {
            file = new FileInputStream("G:\\java\\InputFile\\src\\InputFile.java");     //(1)     
            while((a = file.read()) != -1){
                System.out.print((char)a);
            }
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e){
        System.out.println(</span>"文件读取错误"<span style="color: rgba(0, 0, 0, 1)">);
        System.exit(</span>-1<span style="color: rgba(0, 0, 0, 1)">);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">{
        </span><span style="color: rgba(0, 0, 255, 1)">if</span>(file != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">){
        file.close();
        }
    }
}

}

 


一般都要将关闭资源.close()放在 finally 代码块中,防止 try 中发生异常资源没有关闭,可上边代码报了 IOException 错误,当 file.close(); 写在 try 块最后就没有问题,原因是我把文件声名
FileInputStream file = null;
放在 try 块的外面,如果 try 中(1)执行失败,将会抛出 NullPointerException 异常,此时 file==null, 不会执行 file.close(); 如果(1)成功,关闭 file 时会抛出 IOException 异常,Java 要求必须处理,所以需要在 finally 加一个 try-catch 块。

finally{
            if(file != null){
                try{file.close();
                    }
                catch(IOException e){}}
        }

 


  或者用 java7 或更晚的版本中出现的 try-with-resources:

import java.io.*;
public class InputFile {
    public static void main(String [] args){
        int a = 0;
    </span><span style="color: rgba(0, 0, 255, 1)">try</span> (FileInputStream file = <span style="color: rgba(0, 0, 255, 1)">new</span> FileInputStream("G:\\java\\InputFile\\src\\InputFile.java"<span style="color: rgba(0, 0, 0, 1)">))
    {        
        </span><span style="color: rgba(0, 0, 255, 1)">while</span>((a = file.read()) != -1<span style="color: rgba(0, 0, 0, 1)">){
            System.out.print((</span><span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)">)a);
        }
        file.close();
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e){
        System.out.println(</span>"文件读取错误"<span style="color: rgba(0, 0, 0, 1)">);
        System.exit(</span>-1<span style="color: rgba(0, 0, 0, 1)">);
    }    
    
}

}

 

总结:1. 声明 FileInputStream 需要在 try 块外保证 finally 能访问到
2. 声名时必须赋初值,否则如果在 new 时错误将出现编译错误
3.file.close() 会抛出 IOException 异常,需要处理
4.java7 的新特性 try-with-resources,
try(try-with-resources){
}
在 try-with-resources 中声名资源,java 会帮我们自动关闭,这是一种比较简单的处理方式