首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从“尝试”中移出资源

从“尝试”中移出资源
EN

Stack Overflow用户
提问于 2020-09-11 09:30:08
回答 1查看 83关注 0票数 1

我想要创建一个包装资源的类实例。问题:当构造函数抛出时,资源就会丢失。我想找个解决办法。尝试资源是一个看起来很好的构造,但我不能将资源移出它。

例如,包装HTTP客户端的服务客户机:

代码语言:javascript
复制
class ServiceClient implements Closeable {
  ServiceClient(ClosableHTTPClient client) { /* ... */ }
  public close() { client.close() }

  public ServiceClient create(String url) throws IOException {
    try (ClosableHTTPClient client = createHttpClient(url)) {
      return new ServiceClient(client);
    }  // make try-with do not close `client` on success
  }

  public ClosableHTTPClient createHttpClient(String url) {
    return HttpClientBuilder.create()
        .setConnectionManager(createClosableConnectionManager()) // must be closed, when `build` throws 
        .build();
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-11 09:41:44

--引发异常的构造函数.

代码语言:javascript
复制
class Foo implements AutoClosable {

    private final Bar someResource;

    /**
     * @param someResource whose ownership is taken over.
     */
    Foo(Bar someResource) {
        this.someResource = someResource;
        try {
            ...
        } catch (Throwable e) {
            someResource.close(); // If this.close is not final.
            throw e;
        }
    }

    @Override public void close() { someResource.close(); }
    ...

唯一的解决方案是处理构造函数中抛出的任何异常。有时会忘记标准java类(容量为负值的BufferedReader不会关闭包装好的读取器)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63844348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档