java 有没有with语句_Java中的try-with-resources语句

在这个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值