标签:resource stream tac trace 创建对象 i++ NPU 保存 自动
使用try catch finally 处理流中的异常
格式:
try{
? 可能会产生的异常代码
? }catch(异常类变量 变量名){
? 异常的处理逻辑
? }finally{
? 一定会执行的代码
? 释放资源
? }
示例代码:
public static void main(String[] args) {
// 提高变量fw的作用域,让finally可以使用
// 变量在定义的时候,可以没有值,但是使用的时候必须有值
// fw = new FileWriter("Q:\\Test\\e.txt");执行失败,fw没有值,fw.close会报错
FileWriter fw = null;
try {
// 可能会产生异常的代码
fw = new FileWriter("D:\\Test\\e.txt");
for (int i = 1;i<10;i++){
fw.write("HelloWorld"+i+"\r\n");
}
}catch (IOException e){
// 异常的处理逻辑
System.out.println(e);
}finally {
// 一定会执行的代码
// 创建对象失败了,fw的默认值是null,null是不能调用方法的,会抛出NullPointerException,需要增加一个判断,不是null在释放资源
if(fw!=null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
还可以使用JDK7优化后的try-with-resource
语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。
JDK7的新特性
在try的后边可以增加一个(),在括号中可以定义流对象
那么这个流对象就在try中有效
try中的代码执行完毕,会自动释放流对象,不用写finally
格式:
try (定义流对象;定义流对象 如果多个,使用‘;‘隔开) {
可能会产生异常的代码
} catch (异常类变量 变量名) {
异常的处理逻辑
}
示例代码
public static void main(String[] args) {
try (
// 1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("c:\\Test\\1.jpg");
// 2.创建一个字节输入流对象,构造方法中绑定要写入的目的地
FileOutputStream fos = new FileOutputStream("d:\\Test\\1.jpg");
){
// 可能会产生异常的代码
// 一次读取一个字节写入一个字节的方式
// 3.使用字节输入流对象中的方法read读取文件
int len = 0;
while ((len = fis.read())!=-1){
// 4.使用文件字节输出流中的方法write,把读取到的文件写入目的地
fos.write(len);
}
}catch (IOException e){
System.out.println(e);
}
}
JDK9中try-with-resource
的改进,对于引入对象的方式,支持的更加简洁。被引入的对象,同样可以自动关闭,无需手动close,我们来了解一下格式。
改进前格式:
// 被final修饰的对象
final Resource resource1 = new Resource("resource1");
// 普通对象
Resource resource2 = new Resource("resource2");
// 引入方式:创建新的变量保存
try (Resource r1 = resource1;
Resource r2 = resource2) {
// 使用对象
}
改进后格式:
// 被final修饰的对象
final Resource resource1 = new Resource("resource1");
// 普通对象
Resource resource2 = new Resource("resource2");
// 引入方式:直接引入
try (resource1; resource2) {
// 使用对象
}
改进后,代码使用演示:
public class TryDemo {
public static void main(String[] args) throws IOException {
// 创建流对象
final FileReader fr = new FileReader("in.txt");
FileWriter fw = new FileWriter("out.txt");
// 引入到try中
try (fr; fw) {
// 定义变量
int b;
// 读取数据
while ((b = fr.read())!=-1) {
// 写出数据
fw.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
标签:resource stream tac trace 创建对象 i++ NPU 保存 自动
原文地址:https://www.cnblogs.com/anke-z/p/12682937.html