我正在使用方便的 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 对象非空,该方法返回 true,但从不调用 sapApi 的 close() 方法。我现在求助于使用 finally 块,它工作正常。但这很令人费解。Java 字节码还包含对关闭的调用。有没有人见过这种行为?
编辑以澄清情况:
这是 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()。