2

in.close()私はこのコードを見て、なぜfinally block. の主なポイントtry-with resourcesは、それclosesresources正しいということです。

  File file = new File(FILE_NAME);
          FileInputStream in = null;

        try (in = new FileInputStream(file)){
            //do something
        } catch (final FileNotFoundException e) {
            log.log(Level.WARNING, "file not found, " + file.getAbsolutePath(), e);
        } catch (final IOException e) {
            log.log(Level.WARNING, "cannot access the file for reading", e);
        } finally {
            if (in != null){
                try {
                    in.close();
                } catch (final IOException e) {
                    log.log(Level.WARNING, "Attempt to close file failed.", e);
                }
            }
        }

Java で try-with-resources を使用して、ファイルを開くことはできても閉じることができないという状況はありますか?

4

4 に答える 4

4

あなたの例のfinallyブロックは冗長です。try-with-resources ステートメントは、基本的に同じことを行っています (ただし、エラーが発生しにくくなっています!)。try-with-resources ステートメントがリソースを閉じようとした後に実行されるため、finallyブロックは基本的にヌープです (最初の失敗後にリソースを閉じようとする 2 回目の試行が成功する可能性がありますが、これが可能である場合でも) 、それは無視できるエッジケースであり、確かに非決定論的です)。

catch対照的なブロックは重要であることに注意してください。ブロックがアクティブになる前にリソースを閉じようとするためcatch、複数の例外が発生する可能性があります。これは、抑制された例外を使用することで解決されます。したがって、リソースの使用が失敗した場合でも、リソースを適切に閉じようとする試みが行われ (これも失敗することがよくあります) catchブロックは最初のエラーを隠して閉じるときにスローされる例外ではなく、最初の (おそらく根本的な) 原因を受け取ります。

詳細については、公式ドキュメントを参照してください。

于 2014-02-04T22:27:41.167 に答える