Анализатор обнаружил в классе, реализующем интерфейс '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(); } }
Данная диагностика классифицируется как: