48

これが間違っている場合は修正してください: Java 7 の try-with-resources ステートメントでは、リソースのclose()メソッドによってスローされた例外はすべて、メソッドによってスローされたものとして宣言するか、try 全体を別のメソッドでラップして、tryによってスローされた例外をキャッチする必要がありますclose()

もしそうなら、私はそれを大いに活用するかどうか疑問に思う必要があります. 私は確かにthrowによってスローされた例外を望んでいませんclose()。呼び出し元はそれをどうするかわかりません。そして、少なくとも私には、扱うためだけにtry別のラッピングをするのはあまりエレガントに見えません.tryclose()

編集: 誤って 2 つの質問をしたと思いますが、そのうちの 1 つは重複していました。

質問 1. メソッドがメソッドから例外をスローすることを宣言するclose()か、try-with-resources を別の try にラップする必要がありますか? (提案された重複では回答されていません。)

質問 2. リソースをサイレント モードで閉じる方法はありますか? (明らかに重複しているため、その文を質問から外しています。これにより、質問が十分にユニークになることを願っています。)

4

4 に答える 4

40

Java 言語仕様 ($14.20.3.2)からの引用:

14.20.3.2 拡張された try-with-resources

少なくとも 1 つの catch 節および/または finally 節を含む try-with-resources ステートメントは、拡張 try-with-resources ステートメントと呼ばれます拡張された try-with-resources ステートメントの意味:

    try ResourceSpecification
        ブロック
    キャッチopt
    最後にopt

try-catchまたは try-finallyまたは try-catch-finally ステートメント内にネストされ た基本的なtry-with-resourcesステートメント ( §14.20.3.1 )への次の翻訳によって与えられます 。

    try {
        try ResourceSpecification
            Block
    }
    キャッチopt
    最後にopt

変換の効果は、ResourceSpecification を try ステートメントの「内側」に置くことです。これにより、拡張された try-with-resources ステートメントの catch 句で、リソースの自動初期化またはクローズによる例外をキャッチできます。

つまり、基本的にラッパーはすでに実装されています

于 2013-04-09T07:12:36.083 に答える
25

Javaのチュートリアルから

try-with-resources ステートメントは、通常の try ステートメントと同様に、catch および finally ブロックを持つことができます。try-with-resources ステートメントでは、catch または finally ブロックは、宣言されたリソースが閉じられた後に実行されます。

(私のものを強調)

だからあなたは簡単にできる

try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    return br.readLine();
}
catch (IOException e) {
    // handle the exception that has been thrown by readLine() OR by close().
}
于 2013-04-09T07:07:34.393 に答える
7

try-with-resources を別の try-catch ブロックでラップする必要はありません。catch ブロックを追加するだけです。

class Foo implements AutoCloseable {
    public void close() throws Exception {
        throw new Exception();
    }
}

public class Try {
    public static void main(final String[] args) {
        try(Foo f = new Foo()) {
            System.out.println("No op!");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
于 2013-04-09T07:07:48.277 に答える
2

catch (Exception e) { }適切な句を追加するだけでよいはずです。特定のものに対して特別な処理を行う必要がある場合、またはExceptionより広い範囲が必要な場合は、単純にキャッチできます。

try (Statement stmt = con.createStatement()) {
    ResultSet rs = stmt.executeQuery(query);

    while (rs.next()) {
        String coffeeName = rs.getString("COF_NAME");
        int supplierID = rs.getInt("SUP_ID");
        float price = rs.getFloat("PRICE");

        System.out.println(coffeeName + ", " + supplierID + ", " + 
                           price + ", " + sales + ", " + total);
    }
} catch (Exception e) {
    System.out.println("Exception while trying to through the queries. ", e);
}

これは Java 7 であるため、実際には catch 句ごとに複数の例外を配置することも、必要な最も外側の例外を単純にキャッチすることもできます。

于 2013-04-09T07:08:08.193 に答える