首页 > 其他分享 >try-with-resources语句

try-with-resources语句

时间:2023-10-04 16:55:24浏览次数:35  
标签:语句 testData try testselector Test 异常 public resources

try-with-resources语句

try-with-resources语句是一种声明了一种或多种资源的try语句。资源是指在程序用完了之后必须要关闭的对象。try-with-resources语句保证了每个声明了的资源在语句结束的时候都会被关闭。任何实现了java.lang.AutoCloseable接口的对象,和实现了java.io.Closeable接口的对象,都可以当做资源使用。

因为 Closeable 接口继承了 AutoCloseable

如:

public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

其实这种方法只是简化了代码的冗杂程度,反编译的结果一定还是 判断非空加 finally

写法初识

此时如果将 资源写入到表达式中,那么无论表达式是正常结束还是异常技术,其都会被关闭,即使抛出了异常。

@Slf4j
class Test implements AutoCloseable{

    public void testData(){
        log.debug("测试样例");
    }

    @Override
    public void close() throws Exception {
        log.debug("程序正在关闭异常");
    }
}

public class TestTryWithResource {
    public static void main(String[] args) {
        try(Test test = new Test()){
            test.testData();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果

10:50:31.961 [main] DEBUG nio.testselector.Test - 测试样例
10:50:31.963 [main] DEBUG nio.testselector.Test - 程序正在关闭异常

同时反编译刚才的 class 会发现只是编译器给我们生成了非空判断以及finally

异常屏蔽

那么如果在 close 方法 和 testData 方法中继续抛出异常会发生什么呢?

@Slf4j
class Test implements AutoCloseable{

    public void testData() throws Exception{
        throw new Exception("testData 出现异常");
    }

    @Override
    public void close() throws Exception {
        throw  new MyException("我自定义的异常");
    }
}

结果如下

java.lang.Exception: testData 出现异常
	at nio.testselector.Test.testData(TestTryWithResource.java:10)
	at nio.testselector.TestTryWithResource.main(TestTryWithResource.java:22)
	Suppressed: nio.testselector.MyException: 我自定义的异常
		at nio.testselector.Test.close(TestTryWithResource.java:15)
		at nio.testselector.TestTryWithResource.main(TestTryWithResource.java:21)

这说明了一个什么问题呢?异常信息中的 Suppressed 又是什么意思呢???

顾名思义, Suppressed exceptions是在代码中引发的异常,但是以某种方式被忽略了。 如果您还记得try-catch-finally块的执行顺序以及它们如何返回任何值或异常,那么您会记得, 如果try块中也引发了异常,则可以抑制在finally块中引发的异常

也就是说这种写法告诉了我们,异常其实是由俩个异常组成的,而MyException是被Suppressed的异常。

标签:语句,testData,try,testselector,Test,异常,public,resources
From: https://www.cnblogs.com/shenzizai/p/17742451.html

相关文章

  • mybatis项目启动报错:reader entry: ���� = v
    问题再现在SSM项目中,启动程序时控制台会报乱码,如下图所示:解决方案一去掉mybatis配置文件中关于别名的配置,然后在mapper.xml文件中使用完整的类名。待删除的示例代码如下:<typeAliases><packagename="com.tiku.domain.entity"/></typeAliases>解决方案二添加新的依赖......
  • 常用的SQL语句小结(二)---普通查询,注释,聚合,分组,复杂查询
    1.普通查询(1)查询所有列SELECT* FROMProduct;(2)查询部分列(跟(1)对比,相当于可以自己确定顺序)SELECTproduct_id,product_name,product_type,sale_price,purchase_price,regist_date FROMProduct;(3)查询时设置别名,英文和中文的区别英文案例:SELECTproduct_idASid,prod......
  • SQLite学习笔记——AND、OR运算符和UPDATE、DELETE语句
    运算符AND运算符带有WHERE字句的AND运算符语法如下SELECTcolumn1,column2,...columnNFROMtable_nameWHERE[condtion1]AND[condition2]...AND[conditionN];当满足AND连接的所有条件时,对应的列才会被选出来OR运算符带有WHERE子句的OR运算符语法如......
  • 常用的SQL语句小结
    只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称  1.创建一张表CREATETABLE<表名>(<列名1><数据类型><该列所需约束>,<列名2><数据类型><该列所需约束>,<列名3><数据类型><该列所需约束>,<列名4><数据类型><该列所需约束>,<该表的约束1>,<该表的约束2......
  • SQLite学习笔记——创建数据库和SELECT,INSERT语句
    SQLite创建数据库我们可以直接使用sqlite3DatabaseName.db来创建数据库,这时候我们就会发现同一目录下出现了对应的.db文件或者我们可以先启动sqlite3然后在里面使用点命令.openDatabaseName.db来创建数据库,如果已经存在对应的数据库,那么我们默认就会打开该数据库。......
  • 用sql语句查询出表结构,在结果就能看到数据库所有表的结构,这个时候只要全选,然后右击出
    SELECT表名=CaseWhenA.colorder=1ThenD.nameElse''End,表说明=CaseWhenA.colorder=1Thenisnull(F.value,'')Else''End,字段序号=A.colorder,字段名=A.name,字段说明=isnull(G.[value],......
  • chat2db教程:根据对话内容生成SQL语句
    准备示例表--学生信息表droptableifexistsSTUDENT;CREATETABLEstudent(idINTPRIMARYKEYAUTO_INCREMENTCOMMENT'学生ID',nameVARCHAR(50)NOTNULLCOMMENT'学生姓名',genderVARCHAR(10)NOTNULLCOMMENT'学生性别',birthdayDATEN......
  • 主流常见关系数据库分页sql语句写法。MySQL、PostgreSQL、SQLite、Oracle、DB2、SQL S
    前言1.分页sql逻辑:每页10条,取第3页。即取第21~30条数据1.1.MySQL/SQLite/PostgreSQLselect*fromdemolimit10offset20;select*fromdemolimit20,10;--PostgreSQL不支持该写法1.2.Oracle12C+Oracle11g之前很难用,Oracle12C+与MySQL用法格式一样了,只是语法关......
  • 流程控制语句
    流程控制语句1.if...elseif...else//example.gopackagetestimport"fmt"funcIfElse(){ varageuint8 fmt.Println("请输入你的年龄") fmt.Scanln(&age)//单行读入 ifage<13{ fmt.Println("小朋友不要学编程") }}//main.gopackagem......
  • mysql基础语句
    1.基本语句mysql-uroot-p--连接数据库showdatabases--列出所有数据库createdatabasexxx--创建一个数据库usexxx--切换到xxx数据库showtables--列出当前数据库所有的表--注释/*(多行注释)hellor3ality*/数据库xxx语言DDLdefineDMLmanage......