Java try / catch / finally лучшие практики при получении / закрытии ресурсов

Работая над школьным проектом, я написал следующий код:

FileOutputStream fos;
ObjectOutputStream oos;
try {
    fos = new FileOutputStream(file);
    oos = new ObjectOutputStream(fos);

    oos.writeObject(shapes);
} catch (FileNotFoundException ex) {
    // complain to user
} catch (IOException ex) {
    // notify user
} finally {
    if (oos != null) oos.close();
    if (fos != null) fos.close();
}

Проблема в том, что Netbeans сообщает мне, что строки resource.close () вызывают исключение IOException и поэтому должны быть пойманы или объявлены. Он также жалуется на то, что oos и fos могут еще не быть инициализированы (несмотря на нулевые проверки).

Это кажется немного странным, поскольку весь смысл в том, чтобы остановиться IOException прямо там.

Мое исправление заключается в следующем:

} finally {
    try {
        if (oos != null) oos.close();
        if (fos != null) fos.close();
    } catch (IOException ex) { }
}

Но в глубине души меня это беспокоит и кажется грязным.

Я пришел из фона C #, где я бы хотел просто воспользуйтесь преимуществом блока using , поэтому я не уверен, какой «правильный» способ справиться с этим.

Какой правильный способ решить эту проблему?

40
задан Austin Hyde 4 November 2010 в 00:28
поделиться