1つではなく、2つのファイルを開く必要があるとします。あなたはします
final InputStream in = new FileInputStream(file1);
final OutputStream out = new FileOutputStream(file2);
try {
// ...
} finally {
out.close();
in.close();
}
out
失敗した場合は例外が発生し、try
ブロック外であるため、ブロックin
内で閉じられませんfinally
。
他の方法では:
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(file1);
out = new FileOutputStream(file2);
// ...
} finally {
if (out != null) out.close();
if (in != null) in.close();
}
out
開くことができない場合は、finally
ブロックに移動して両方のストリームを閉じます。in
開くことができない場合は、finallyブロックに移動し、解放するだけですin
-なぜならout==null
。
編集
aetheriaが述べたように、close()
Javaで例外がスローされるため、そのコードは機能しません。try
各リソースリリースを独自の-catch
ブロックに配置することで簡単に修正できます。
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(file1);
out = new FileOutputStream(file2);
// ...
} finally {
try{ out.close(); }catch(Exception e){}
try{ in.close(); }catch(Exception e){}
}
nullチェックを破棄しました-in
またはがnullの場合、無視されるout
aがスローされます。NullPointerException
そして、私close
が例外を無視する理由は、廃棄メソッドがそもそも例外をスローしてはならないからです。終了例外の処理が必要な場合は、ブロック後にいつでもストリームを再度閉じることができます。そうすれば、閉じることができるfinally
すべてのストリームがすでに閉じられており(したがって、心配する必要はありません)、よりエレガントに例外を処理できます。close
さて、aetheriaは、次のようになるリソースごとに個別のtry
-ブロックを配置することも提案しました。finally
final InputStream in = new FileInputStream(file1);
try {
final OutputStream out = new FileOutputStream(file2);
try {
// ...
} finally {
out.close();
}
} finally {
in.close();
}
これは機能しますが、リソースが2つしかない場合でも、割り当てとリリースコードが分割され、追跡が困難になるため、エレガントさが大幅に低下します(少なくとも私の意見では)。