编程语言
首页 > 编程语言> > java-try-with-resources无法调用close()

java-try-with-resources无法调用close()

作者:互联网

我正在使用方便的try-with-resources语句关闭连接.在大多数情况下,此方法效果很好,但仅以一种完全简单的方法无法正常工作.即,这里:

public boolean testConnection(SapConnection connection) {
  SapConnect connect = createConnection(connection);
  try ( SapApi sapApi = connect.connect() ) {
    return ( sapApi != null );
  } catch (JCoException e) {
    throw new UncheckedConnectionException("...", e);
  }
}

sapApi对象为非null,该方法返回true,但是从不调用sapApi的close()方法.我现在求助于使用工作正常的finally块.但这很令人困惑. Java字节代码还包含一个close调用.有人见过这种行为吗?

编辑以澄清情况:

这就是SapApi,它实现了AutoCloseable.

class SapApi implements AutoCloseable {

  @Override
  public void close() throws JCoException {
    connection.close(); // this line is not hit when leaving testConnection(..)
  }
..
}

以下是与testConnection(..)相同的类中的另一个方法.在返回之前,在这里调用SapApi.close().

@Override
public List<Characteristic> selectCharacteristics(SapConnect aConnection,   InfoProvider aInfoProvider) {
  try (SapApi sapi = aConnection.connect()) {
    return sapi.getCharacteristics(aInfoProvider);
  } catch ( Exception e ) {
    throw new UncheckedConnectionException(e.getMessage(), e);
  }
}

编辑2:
这是SapConnect.connect():

SapApi connect() {
  try {
    ... // some setup of the connection
    return new SapApi(this); // single return statement
  } catch (Exception e) {
    throw new RuntimeException(e);
  }
}

SapApi没有子类.上面的close方法只有一种实现.特别是,没有空的close().

解决方法:

为了调用close(),SapApi必须实现AutoCloseable接口,但是由于我们在谈论连接,所以SapApi将实现抛出IOException的Closable接口更为合适.

读这个:
http://tutorials.jenkov.com/java-exception-handling/try-with-resources.html

标签:try-with-resources,java
来源: https://codeday.me/bug/20191120/2044906.html