在IO流等流中如果使用了一个流那么要在使用完毕后释放掉它,不然它会继续占用内存空间,但是如果在使用中出现了异常,而我们只是将异常向上抛出,而不是自定义异常去解决,那么只有等到在Throwable里将程序停止,并且打印出异常后,程序才算终止,为了避免这种情况的发生,java为我们提供了finally的用法,
finally再java中的定义是有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的.
那么也就是说无论异常是否抛出,程序是否要关闭,方法是否要停止,finally中的语句是肯定要执行一次的.这就是他的优点,同事也就说明了他的缺点:尽量不要在finally中写入return.一旦写入return,程序在出现异常的时候一样会有返回值返回到调用方法中.这样很有可能在内存中即使保留了这个数据,这个数据也没有实际意义.
举个IO流的例子给大家说明一下.
使用代码实现
写一个实现把字符串中数据,写入项目根目录下的content.txt文件中.
/*
1.定义类(Test1)
2.写一个静态方法 void write(String content),在方法中
定义字符缓冲输出流变量BufferedWriterbw;
写一个try{ }catch(IOException e){ }finally{ }代码块
在try{ }在代码块中
创建BufferedWriter对象,绑定content.txt文件,赋值给bw
调用bw的write()方法,传入content
在catch代码块中,打印异常信息
在finally代码块关闭流
写try{}catch(IOExceptionex){} 代码块
在try 代码块中,如果bw!=null,调用bw.close()方法
在catch代码块,打印异常信息
3.在main方法中调用write(String conent)方法
*/
public class Test1 {
// 写一个静态方法 void write(Stringcontent)
public static void write(String content){
// 定义字符缓冲输出流变量BufferedWriterbw,初始值为null;
BufferedWriter bw = null;
// 写一个try{ }catch(IOException e){ }finally{ }代码块
try{
// 在try{ }在代码块中
// 创建BufferedWriter对象,绑定content.txt文件,赋值给bw
bw = new BufferedWriter(new FileWriter("content.txt"));
// 调用bw的write()方法,传入content
bw.write(content);
}catch(IOException e){
// 在catch代码块中,打印异常信息
e.printStackTrace();
}finally{
// 在finally代码块关闭流
// 写try{}catch(IOExceptionex){} 代码块
try{
// 在try 代码块中,如果bw!=null,调用bw.close()方法
if(bw != null){
bw.close();
}
}catch(IOException ex){
// 在catch代码块,打印异常信息
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
write("HelloWorld");
}
}
========================================================在实际开发中,finally的用法大多数是关闭流的,所以及时在其他自定义异常中砍不到finally,也不要忽视他的作用.