2017-02-21 18 views
1

私は以下のtryブロックを持っていて、以前クローズ可能なfsが作成されています。tryブロックにリソースが作成されていないリソースで試してください

最終的にクローズするか、明示的に閉じる必要はありますか?

try (BufferedReader reader = new BufferedReader(new InputStreamReader(fs.open(path)))) { 
... 
} 
+0

fsとは何ですか?リソース内試行括弧内で**宣言されたすべてのリソースは、後で閉じられます。 finallyブロックで手動で閉じる場合と同じ効果があります。ブロック自体の前または内部で宣言されたすべてのリソースは自動的に閉じられません。 'Autoclosable'インターフェースを実装するすべてのオブジェクトは、try-with-resourcesで使用できます。詳細はこちら[try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) –

+0

これはHadoop FSですが、そのtryブロックに到達する前に作成されています。 – user432024

答えて

3

From the JLS

リソースは、左から右の順で初期化されていることがわかりました。リソースが初期化に失敗した場合(つまり、初期化子式が例外をスローする場合)、try-with-resourcesステートメントによってこれまでに初期化されたすべてのリソースが閉じられます。すべてのリソースが正常に初期化されると、tryブロックは通常どおり実行され、try-with-resourcesステートメントの非nullリソースはすべて閉じられます。

リソースは、初期化されたのと逆の順序で閉じられます。リソースは、null以外の値に初期化された場合にのみクローズされます。 1つのリソースのクローズからの例外は、他のリソースのクローズを防ぎません。以前にイニシャライザ、tryブロック、またはリソースのクローズによって例外がスローされた場合、そのような例外は抑制されます。

唯一のインスタンスはブロックが宣言の逆の順序で閉鎖されResourceSpecificationに宣言する。

fsの試用リソースの前に宣言されているので、このインスタンスは閉じられません。

+0

これは詳細な記述があるため、答えとしてマークします。 – user432024

+0

する必要がありますように!それは良い答えです。 upvoteをしてください。 – Bathsheba

4

reader.close()のみが呼び出されます。概念的には、プログラム制御が}に到達する直前であり、これにはtryブロックに例外がスローされた場合も含まれます。

しかし、通常の方法でfsを処理する必要があります。あなたができる

+0

しかし、彼はブロック内の別々のソースとして 'fs'を宣言できず、以下のソースにそれを使用できませんでしたか? – SomeJavaGuy

+0

私は、ポイントは、fsが外部でインスタンス化されたことです。 – user432024

関連する問題