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 会帮我们自动关闭,这是一种比较简单的处理方式