1

次のコードを検討してください。

    FileOutputStream stream=null;
    ObjectOutputStream objStr=null;
    try
    {
        stream=new FileOutputStream(defaultFile);
        objStr=new ObjectOutputStream(stream);
        objStr.writeObject(obj);
        objStr.close();
    }
    catch(FileNotFoundException e)
    {
        System.out.println("Il file "+ defaultFile+ " non è stato trovato\n");
    }
    catch(IOException e)
    {
        stream.close();
        System.out.println("Si è verificato un problema di I/O nell' apertura dello  stream");
    }

2 番目の catch ブロックでは、ストリームを閉じますが、閉じる必要があるかどうかはわかりません。
ObjectOutputStream のコンストラクターが失敗した場合は 2 番目の catch に入りますが、この場合、FileOutputStream は開いたままになるのでしょうか?
すべての例外を処理するために finally ブロックを作成しますか?
すべてのケースを把握するのは難しいです。

4

3 に答える 3

4

Java 7 を使用している場合は、try-with-resourcesステートメントを使用して、すべての終了を処理できます。

try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(defaultFile))) {
    oos.writeObject(obj);
} catch (IOException e) {
    e.printStackTrace();
}
于 2012-03-31T14:33:02.617 に答える
2

try-catch ステートメントに finally ブロックを追加し、そこで終了します。そこで別の try-catch と nullcheck を回避するには、commons.io IOUtils.closeQuietly()を使用できます。

    FileOutputStream stream = null;
    ObjectOutputStream objStr = null;
    try {
        stream = new FileOutputStream(defaultFile);
        objStr = new ObjectOutputStream(stream);
        objStr.writeObject(obj);
    } catch (FileNotFoundException e) {
        System.out.println("Il file " + defaultFile + " non è stato trovato\n");
    } catch (IOException e) {
        System.out.println("Si è verificato un problema di I/O nell' apertura dello  stream");
    } finally {
        IOUtils.closeQuietly(stream);
        IOUtils.closeQuietly(objStr);
    }      
于 2012-03-31T14:41:22.893 に答える
1

次のように、ストリームを閉じる前に if 条件を追加できます。

if(stream != null) {
    stream.close();
}
于 2012-03-31T14:35:02.857 に答える