目录
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课程