Зачем мне беспокоиться об исключениях IOException, когда файл закрыт?

Так коротко и просто, да & lt; Тип & gt; [] является типом Object. Он распространяется непосредственно из Object, насколько я понимаю. На нем есть все методы Object, toString(), hashCode(), ... плюс специальная открытая переменная, называемая length. Класс java.util.Arrays - это класс утилиты для работы с типами массивов. Это немного запутанно, когда вы добавляете в беспорядок такие вещи, как: int[] не наследуется от Object[]. Кроме того, в отличие от других типов Object нет конструкторов для типов массивов. Они уважают ключевое слово new, но обычно это выделяется для размера. Это немного странно, но только один из этих языковых причуд.

Чтобы ответить на вопрос, да, они являются объектом.

13
задан izb 13 May 2009 в 13:22
поделиться

3 ответа

I would at the very least log the exception.

I've seen it happen occasionally, if the attempt to close the file fails due to it not being able to flush the data. If you just swallow the exception, then you've lost data without realizing it.

Ideally, you should probably swallow the exception if you're already in the context of another exception (i.e. you're in a finally block, but due to another exception rather than having completed the try block) but throw it if your operation is otherwise successful. Unfortunately that's somewhat ugly to sort out :(

But yes, you should at least log it.

21
ответ дан 1 December 2019 в 17:59
поделиться

Вам будет небезразлично, если метод close () сбрасывает записанное содержимое из буфера в файловую систему, и это не сработает. например, если файл, в который вы пишете, находится в удаленной файловой системе, которая стала недоступной.

Обратите внимание, что вышеупомянутый re. очистка применяется к любому потоку вывода, а не только к файлам.

19
ответ дан 1 December 2019 в 17:59
поделиться

Наиболее частые проблемы close () - это нехватка дискового пространства или, как сказал Брайан, удаленный поток, который пропал.

ПРИМЕЧАНИЕ:

Вы действительно должны увидеть что-то вроде (примечание: я не проверял это при компиляции)

SomeKindOfStream stream = null;
Throwable pending = null;
try {
    stream = ...;
    // do stuff with stream

} catch (ThreadDeath t) {
    // always re-throw thread death immediately
    throw t;

} catch (Throwable t) {
    // keep track of any exception - we don't want an exception on
    //   close() to hide the exceptions we care about!
    pending = t;

} finally {
    if (stream != null)
        try {
            stream.close();
        } catch (IOException e) {
            if (pending == null)
                pending = e;
        }
    }
    if (pending != null) {
        // possibly log - might log in a caller
        throw new SomeWrapperException(pending);
          // where SomeWrapperException is unchecked or declared thrown
    }
}

Почему все это?

Имейте в виду, что Java может отслеживать только одно «ожидающее» исключение за раз. Если тело основного блока try выдает исключение, и close () в finally генерирует исключение, единственное, о чем вы будете знать, это close ().

Вышеупомянутая структура делает следующее:

  • Отслеживает все бросаемые брошено в теле попытки
  • В случае, если это исключение - смерть потока, немедленно вызовите его повторно!
  • При закрытии, если у нас нет ожидающего исключения, отслеживать исключение закрытия; в противном случае следует отслеживать ранее созданное исключение. (В этом случае вам, вероятно, следует попытаться зарегистрировать ошибку close ())
  • В конце, если есть ожидающее исключение, обработайте его. Обычно заворачиваю и перекидываю. Лично я использую непроверенную оболочку, поэтому мне не нужно, чтобы все вызывающие абоненты в цепочке вызовов объявляли throw.

Чтобы сделать это,

4
ответ дан 1 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: