在这个Java程序示例中:

package test;

import java.sql.DriverManager;

import java.sql.Connection;

import java.sql.Statement;

public class Test

{

private static void example(){

String url = "jdbc:oracle:thin:@//localhost:7856/xe";

String user = "user";

String password = "pass";

try(Connection con = DriverManager.getConnection(url, user, password);

Statement stmt = con.createStatement()){

throw new OutOfMemoryError("Error");

}catch (SQLException e){

System.err.println("SQLException");

}

}

public static void main(String [] args){

try{

example();

}catch (OutOfMemoryError e){

System.err.println("OutOfMemoryError");

}

// Rest of code here...

}

}

当在静态方法example()的主体中抛出OutOfMemoryError错误时,在终止静态方法example()之前,Connection“con”和Statement“stmt”会自动关闭,尽管没有任何捕获这些的“catch”错误,所以在main()的其余代码中确保这两个对象是关闭的?

谢谢.

解决方法:

是; try-with-resources构造总是关闭资源,即使它是一个未经检查的throwable(如OutOfMemoryError).

这在JLS 14.20.3中指定,它以一个非常通用的语句开始,即资源“自动关闭”,但随后会进入资源关闭时的各种示例.基本上,任何非空资源总是被关闭,就好像close已经在为一个资源创建的try-finally的finally子句中.即使在try中有多个资源,也就是这种情况(例如,“关闭一个资源时的异常不会阻止关闭其他资源”).

简单的类来演示它:

public class Twr {

private static class TwrCloseable implements AutoCloseable {

private final String id;

TwrCloseable(String id) {

this.id = id;

}

@Override

public void close() {

System.out.println("closing " + id);

}

}

public static void main(String[] args) {

try (TwrCloseable closeable1 = new TwrCloseable("first");

TwrCloseable closeable2 = new TwrCloseable("second")) {

throw new OutOfMemoryError();

}

}

}

输出:

closing second

closing first

Exception in thread "main" java.lang.OutOfMemoryError

at Twr.main(Twr.java:19)

请注意,它们以相反的顺序关闭; “第二个”在“第一个”之前关闭.在您的示例中,这意味着Statement在Connection之前关闭,这正是您想要的.

标签:java,try-with-resources

来源: https://codeday.me/bug/20190830/1770761.html

java 有没有with语句_Java中的try-with-resources语句相关推荐

  1. java中的循环语句_Java中三种常用的循环语句,一看就懂~

    循环语句:满足一定条件的情况下反复执行一个操作. Java中提供三种常用的循环语句: 1.while循环语句 while先判断为真,再执行while循环语句,如果条件为假,则跳出循环 语法如下: Wh ...

  2. java for嵌套for循环语句_java中的for循环嵌套语句怎么执行?

    展开全部 控制语句--for:语句的嵌套应用:累加求和,计数器:循环嵌套. 一.语62616964757a686964616fe58685e5aeb931333365646232句的嵌套应用 语句嵌套 ...

  3. java 如何跳出if语句_java中跳出或终止if语句的方法

    1.break break:跳出当前循环:但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环.for (int i = 0; i < 10; i++) { if ...

  4. java中循环语句_Java语法基础之循环结构语句详解

    一.循环结构 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循 ...

  5. java中的异常处理语句_Java中实现异常处理的基础知识

    Java中实现异常处理的基础知识 异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. ...

  6. java中简单的if语句_java中if语句的写法

    if语句 if 语句的语法如下:if(布尔表达式){ //如果布尔表达式为true将执行的语句 } 如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码. 免 ...

  7. java中的四个跳转语句_Java中的流程控制语句 (基础篇四)

    流程控制就是对事物次序的布置和安排,在程序中就是对代码执行次序的安排和控制 程序中的流程控制主要有三种:顺序流程.选择流程.循环流程. 顺序流程:比如打印输出的代码按照指定的顺序结构依次排序,打印的结 ...

  8. java do while 循环语句_java中do...while循环语句使用方法详解

    do..while循环语句也称为后测试循环语句,它的循环重复执行方式,也是利用一个条件来控制是否要继续重复执行这个语句.与while循环所不同的是,它先执行一次循环语句,然后再去判断 - do...w ...

  9. java if 定义变量赋值_Java中简单的操作(if语句、常用操作符、switch语句、变量赋值等)...

    ---------------------if语句介绍--------------------------------------------------- class IfDemo { public ...

  10. java常见的报错_Java中常见的错误有哪些?

    原标题:Java中常见的错误有哪些? 1.java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 原因: 1.对系统所访 ...

最新文章

  1. [BZOJ2527]Meteors
  2. kalivm 虚拟机访问win文件夹_利用vmware搭建属于自己的win虚拟环境
  3. CentOS7安装RabbitMQ集群
  4. GDT,LDT,GDTR,LDTR 详解,包你理解透彻
  5. Spring小知识——profile配置
  6. Mysql安装两种方法
  7. Angular应用里具有back功能的按钮实现
  8. JVM性能提升50%,聊一聊背后的秘密武器Alibaba Dragonwell
  9. 线程锁定CPU linux,linux 线程与CPU绑定
  10. 创建一个django的项目 使用自创的虚拟环境
  11. 算法题丨Next Permutation
  12. MySQL 常见索引的使用场景与区别(SQL小技巧)
  13. zookeeper 进入客户端_Zookeeper基础知识简单介绍
  14. php curl 伪造IP来源的代码分享
  15. Python常见陷阱
  16. 内网部署GPS定位系统方案
  17. 【解决:Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2....Could not star】
  18. 读书印记 - 《我们人类的基因:全人类的历史和未来》
  19. 昆明计算机学校录取分数,云南省昆明铁路机械学校2021年招生录取分数线
  20. Google Earth Engine(GEE)——美国俄勒冈大学制作的可视化土地分类下载器

热门文章

  1. 使用Magicodes.SwaggerUI快速配置SwaggerUI以及设置API分组
  2. 程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁
  3. .NET Core 容器化调查
  4. 物联网框架ServerSuperIO在.NetCore实现跨平台的实践路线
  5. Entity Framework Core 懒加载
  6. ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍
  7. 升级ASP.Net Core项目
  8. 【三维激光扫描】实验02:StonexSiScan新建项目、加载点云数据
  9. ArcGIS 10.7拆分多部件要素(Multipart Features)至单部件要素的两种方法
  10. 利用Excel VBA实现批量数据分组转置