目录
try-catch-finally
介绍
实例演示1
实例演示2
try-catch-resource
介绍
实例演示
try-catch-finally
介绍
普通的释放流的方法可能会因中间的异常或是其他原因,导致程序执行不到释放流的代码就结束了,会有资源浪费的风险,所以建议使用另外的资源释放方式来避免这种资源浪费。
try{
...
...
}catch (IOException e){
e.printStack();
}finally{
...
}
- finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止。
- 作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)。
实例演示1
public class Test1 {public static void main(String[] args) {try {System.out.println((10 / 2));
// return; //跳出方法的执行————依旧会执行finally区的代码
// System.exit(0); //终止虚拟机————不会执行finally区的代码} catch (Exception e) {e.printStackTrace();} finally {System.out.println("===finally执行了一次===");}}public static int chu(int a,int b){try {return a/b;} catch (ArithmeticException e) {e.printStackTrace();return -1; //代表程序出现异常} finally {//千万不要在finally中返回数据!
// return 111;}}
}
运行结果:
实例演示2
对上篇的文件复制案例进行修改:
此处会报错的原因:
IDEA担心在finally执行之前,我们就已经把流给释放了,就会产生空指针异常;
或者是在流创建出来前(未赋值)就产生了异常,于是执行finally区的代码同样会空指针异常,
所以使用这个方法我们需要再嵌套一层try-catch
import java.io.*;public class copyFile {public static void main(String[] args){InputStream is = null;OutputStream os = null;try {//需求:复制照片//1.创建一个字节输入流管道与源文件接通is = new FileInputStream("C:/Users/Administrator/Pictures/flower.jpg");//2.创建一个字节输出流管道与目标文件接通os = new FileOutputStream("C:/Users/Administrator/Desktop/test.jpg");//多加一条语句System.out.println(10 / 0);//3.创建一个字节数组,负责转移字节数据byte[] buffer = new byte[1024]; //1KB//4.从字节输入流中读取字节数据,写出去到字节输出流中,读多少写出去多少int len; //记住每次读取了多少个字节while( (len = is.read(buffer)) != -1 ){os.write(buffer,0,len);}System.out.println("复制完成!");} catch (IOException e) {e.printStackTrace();} finally {//释放资源的操作try {os.close(); //从内到外关闭流} catch (IOException e) {e.printStackTrace();}try {is.close();} catch (IOException e) {e.printStackTrace();}}}
}
try-catch-resource
介绍
JDK7开始提供了更简单的资源释放方案:try-with-resource
try(定义资源1;定义资源2;...){ 该资源使用完毕后,会自动调用其close()方法,完成对资
可能出现异常的代码; 源的释放
}catch(异常类名 变量名){
异常的处理代码;
}
- ()中只能放置资源,否则报错
- 资源一般指的是最终实现了AutoCloseable接口。资源都会有一个close方法
public abstract class InputStream implements Closeable{ }
public abstract class OutputStream implements Closeable,Flushable{ }
public interface Closeable extends AutoCloseable{ }
实例演示
同样改造一下文件复制的案例:
import java.io.*;public class copyFile {public static void main(String[] args) throws Exception{try (//1.创建一个字节输入流管道与源文件接通InputStream is = new FileInputStream("C:\\Users\\Administrator\\Pictures\\flower.jpg");//2.创建一个字节输出流管道与目标文件接通OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test.jpg");//注意:这里只能放置资源对象 (流对象)){//需求:复制照片//3.创建一个字节数组,负责转移字节数据byte[] buffer = new byte[1024]; //1KB//4.从字节输入流中读取字节数据,写出去到字节输出流中,读多少写出去多少int len; //记住每次读取了多少个字节while( (len = is.read(buffer)) != -1 ){os.write(buffer,0,len);}os.close(); //从内到外关闭流is.close();System.out.println("复制完成!");} catch (IOException e) {e.printStackTrace();}}
}
END
学习自:黑马程序员——Java课程