﻿# V6128\. Using a Closeable object after it was closed can lead to an exception\.

Анализатор обнаружил вызов метода объекта, у которого ранее был вызван метод close\. Подобные действия могут привести к выбрасыванию исключения\.

Рассмотрим пример: 

```cpp
public void appendFileInformation(String path) throws IOException {
    FileInputStream is = new FileInputStream(path);
    // ....
    is.close();
    // ....
    if (is.available() == 0) {
        System.out.println("EOF");
    }
    // ....
}
```

В условии проверяется, что файл был прочитан полностью\. Для проверки сравнивают количество оставшихся байтов с нулём\. Проблема в том, что при вызове метода `available` будет выброшено исключение типа `IOException` с сообщением `Stream Closed`\. Это связано с тем, что перед условием у переменной `is` вызывается метод `close`\. Следовательно, ресурсы `is` будут освобождены\.

Рассмотрим корректную реализацию `appendFileInformation`: 

```cpp
public void appendFileInformation(String path) throws IOException {
    try (FileInputStream is = new FileInputStream("out.txt")) {
        // ....
        if (is.available() == 0) {
            System.out.println("EOF");
        }
        // ....
    }
}
```

Для корректной работы метода стоит использовать [`try-with-resources`](https://docs.oracle.com/javase/specs/jls/se24/html/jls-14.html#jls-14.20.3)\. В этом случае:

* ресурсы объекта `is` будут автоматически освобождены после выхода из тела `try`;
* вне тела `try` обратиться к объекту не получится — это даёт дополнительную защиту от исключений типа `IOException`;
* даже если в теле `try` возникнет исключение, ресурсы всё равно будут освобождены\.