try-with-catch
学习不可一日荒废,还是老老实实写点笔记吧~
🍔前言
- 要求:JDK1.7及以上
- 用法
Path path= Paths.get(file.getAbsolutePath());
try (
BufferedWriter writer= Files.newBufferedWriter(path,StandardCharsets.UTF_8);
){
writer.write(context);
} catch (IOException e) {
e.printStackTrace();
}
🧈用法
- 简单点
之前我们都是写的
定义资源=null;
try{
//创建资源
}catch(Exception e){
//捕获异常
e.printStackTrace();
}finally{
//有资源使用需要确保关闭
}
这是标准写法,但是对于资源的使用流程都是一样的代码,随着时代的进步,约定大于配置的思想成熟,对于资源的关闭,我用完默认调用close方法关闭吧。
为了和之前版本的兼容以及用法,我们新推出的功能使用新的写法。
- 新写法
try(
//定义且获取资源
){
//正常的使用资源
}catch(Exception e){
e.printStackTrace();
}
就是try后面多了一个括号,这个括号里面写资源的定义和创建,如果没有其他处理可以不写finally块,会自动释放资源。
🍟原理原因
- 原理
资源继承了AutoCloseable
接口,在try的正常使用资源的代码块运行完成后,底层就会调用实现了该接口的close的方法的所有资源,进行关闭。
🥐相关注意点
- 注意点
1 、jdk1.7后面的才有
2 、括号里面 创建的是final的对象
3、资源定义块(也就是try后面()里面的代码)里面如果有多行定义,每行结束需要;
符号,因为就是正常的Java 代码语句,所以多行需要,但是单行可以省略(类比lambda表达式),而且多行的时候,最后一行结尾的;可以省略,当然建议还是都写上
4、可以自定义的资源,实现了AutoCloseable
接口就行;
测试代码如下:
@Test
public void loading() {
try (
AutoCloseTest closeTest = new AutoCloseTest();
) {
//do nothing...
} catch (Exception e) {
e.printStackTrace();
}
}
public class AutoCloseTest implements AutoCloseable {
@Override
public void close() {
System.out.println(this.getClass() + "i am closed");
}
}
恭喜发财,有用的话,点个赞呗,(-.-)