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