Java ужасный блок try-finally - PullRequest
       86

Java ужасный блок try-finally

42 голосов
/ 23 апреля 2010

Есть ли не такой уродливый способ обработать исключение close(), чтобы закрыть оба потока, тогда:

    InputStream in = new FileInputStream(inputFileName);
    OutputStream out = new FileOutputStream(outputFileName);

    try {
        copy(in, out);
    } finally {
        try {
            in.close();
        } catch (Exception e) {
            try {
                // event if in.close fails, need to close the out
                out.close();
            } catch (Exception e2) {}
                throw e; // and throw the 'in' exception
            }
        }
        out.close();
    }

обновление: весь приведенный выше код находится в еще одной попытке-поймать, спасибо за предупреждения.

НАКОНЕЦ (после ответов):

И хороший вспомогательный метод может быть реализован с использованием Идума «Выполнить вокруг» (спасибо Тому Хотину).

Ответы [ 12 ]

0 голосов
/ 18 сентября 2014

Использование

IOUtils.closeNoThrow(myInputStream);

Простой и элегантный.

0 голосов
/ 17 января 2012

В C # существует конструкция using, которая автоматически закрывает закрываемые объекты, когда мы покидаем область действия:

using(Stream s = new Stream(filename)) {
  s.read();
}

Я думаю, что это краткая форма для блока try-finally java.Java 6 представила интерфейс Closable.Итак, using почти там.Когда последний шаг будет сделан в Java 7, он действительно будет потрясающим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...