私が使用して、この例を見てFileInuputStream
とFileOutputStream
:
try (FileInputStream in = new FileInputStream("./TestDir/IOfile.txt");
FileOutputStream out = new FileOutputStream("./TestDir/IOfile_out.txt")) {
// Do something...
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
私が言うの部分を省略し// Do something...
、これらすべての操作がなくなっていても、この問題が発生しますので、。
コンストラクタ以来FileInputStream
とFileOutputStream
捨てることがFileNotFoundException
キャッチなぜ、私が理解することができますFileNotFoundException
。
しかし、捕獲のためのベースは何ですかIOException
?コンパイラが、それはそれなしでは動作せず、私はこれが必要とされていることを知っている可能性がどのように知っていないようです。
例外は、から来ているclose()
あなたはのメソッドシグネチャを見れば、この方法close()
でFileInputStream
/ FileOutputStream
:
public void close() throws IOException
これは、チェック例外のためのthrows節があるIOException
あなたがそれを処理する必要があるので、。また、あなたがしよう-と、リソースを使用しているので、あなたが明示的にクローズされていないとして、これは明らかでないブロック。
開かれたリソースtry
ブロックを呼び出すことによって自動的に閉じられているclose
リソースがインタフェースを実装している提供し、それを終了するときの方法をAutoCloseble
そうでなければ、試し-リソースと、それらを使用することはできません。
あなたは呼び出さない場合close()
に(悪いです)メソッドFileInputStream
/ FileOutputStream
、あなたが対処する必要はありませんIOException
、以下の罰金をコンパイルします:
try {
FileInputStream in = new FileInputStream("./TestDir/IOfile.txt");
FileOutputStream out = new FileOutputStream("./TestDir/IOfile_out.txt");
byte[] buffer = new byte[100];
// more operations
} catch (FileNotFoundException e) {
e.printStackTrace();
}
そして、あなたはfinallyブロックでは、適切なリソースを閉じた場合:
try {
in = new FileInputStream("./TestDir/IOfile.txt");
out = new FileOutputStream("./TestDir/IOfile_out.txt");
byte[] buffer = new byte[100];
// more operations
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
try {
if(in!=null && out!= null) {
in.close();
out.close();
}
}catch (IOException io){
io.printStackTrace();
}
}
あなたはそれを処理する必要があります。