2

さて、私は簡単なクラスを書いていたので、try-catch-finally (それをするのは嫌い) メソッドの代わりにリソースを使用して try を使用しようとしましたが、「不正な型の開始」というエラーが発生し続けます。次に、Java チュートリアルのセクションに目を向けるとhttp://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html、括弧内に新しい変数を割り当てることができることが示されました。何が起こっているのかわかりません。

private static final class EncryptedWriter {

    private final Path filePath;
    private FileOutputStream outputStream;
    private FileInputStream inputStream;

    public EncryptedWriter(Path filePath) {
        if (filePath == null) {
            this.filePath = Paths.get(EncryptionDriver.RESOURCE_FOLDER.toString(), "Encrypted.dat");
        } else {
            this.filePath = filePath;
        }
    }

    public void write(byte[] data) {
        try (this.outputStream = new FileOutputStream(this.filePath.toFile())){

        }   catch (FileNotFoundException ex) {
            Logger.getLogger(EncryptionDriver.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
4

1 に答える 1

12

これは、try-with-resources の仕組みではありません。そこだけを宣言する必要OutputStreamがあります。したがって、これは機能します:

try (FileOutputStream outputStream = new FileOutputStream(this.filePath.toFile())){

try-with-resources の要点は、リソース自体を管理することです。必要なリソースを初期化し、実行がスコープを離れるときにリソースを閉じるというタスクがあります。したがって、他の場所で宣言されたリソースを使用しても意味がありません。開いていないリソースを閉じるのは正しくないため、古いtry-catchの問題が再発します。

そのチュートリアルの最初の行は、次のことを明確に述べています。

try-with-resources ステートメントは、1 つ以上のリソースを宣言するtry ステートメントです。

...宣言は初期化または代入とは異なります。

于 2013-10-13T23:17:01.197 に答える