Анализатор обнаружил в классе, реализующем интерфейс 'Closeable' (или 'AutoCloseable'), поля (ресурсы), которые также реализуют этот интерфейс, но не освобождаются в методе 'close' анализируемого класса.
сlass A implements Closeable {
private FileWriter resource;
public A(String name) {
resource = new FileWriter(name);
}
public void close() {
// Не освобождается resource
}
}
В данном примере поле 'resource' было инициализировано, но внутри класса 'A' не было вызова 'close' для этого поля. Отсутствие вызова метода закрытия приводит к тому, что ресурс не будет освобожден, даже когда для объекта класса 'A' был вызван метод 'close'. Из-за этого может произойти нарушение логики работы программы. Например, если ресурс не будет освобожден, то из-за этого не получится получить доступ к нему из другой части кода.
Такая ошибка может сохраниться, даже если в одном из методов происходит закрытие ресурса:
сlass A implements Closeable {
private FileWriter resource;
public A(String name) {
resource = new FileWriter(name);
}
public void endWrite() {
resource.close();
}
public void close() {
// Не освобождается resource и не вызывается метод endWrite
}
}
Исправить подобную ситуацию можно несколькими способами. Одним из них является освобождение ресурса внутри метода 'close' анализируемого класса:
сlass A implements Closeable {
private FileWriter resource;
public A(String name) {
resource = new FileWriter(name);
}
public void close() {
resource.close();
}
}
Другой вариант исправления — добавление вызова метода, в котором происходит закрытие ресурса в метод close:
сlass A implements Closeable {
private FileWriter resource;
public A(String name) {
resource = new FileWriter(name);
}
public void endWrite() {
resource.close();
}
public void close() {
endWrite();
}
}
Данная диагностика классифицируется как: