6

Java 7 から、try-with-resources ステートメントを使用できます。

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

ifbr.readLine()およびbr.close() both throw exceptionsreadFirstLineFromFileは、try ブロックから例外をスローし(の例外)、try-with-resources ステートメントの暗黙的な finally ブロックからの例外 ( の例外) を抑制します。br.readLine()br.close()

この場合、次のようにtry ブロックの例外からメソッドを呼び出すことで、暗黙の finally ブロックから抑制された例外を取得できます。getSuppresed

try {   
    readFirstLineFromFile("Some path here..."); // this is the method using try-with-resources statement
}   catch (IOException e) {     // this is the exception from the try block  
    Throwable[] suppressed = e.getSuppressed();
    for (Throwable t : suppressed) {
        // Check t's type and decide on action to be taken
    }
}

しかし、finally ブロックが使用されている Java 7 よりも古いバージョンで記述されたメソッドを使用する必要があるとします。

static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        if (br != null) br.close();
    }
}

次に、br.readLine()もう一度br.close()両方が例外をスローすると、状況が逆転します。メソッドはfinally ブロックからの例外 ( の例外)readFirstLineFromFileWithFinallyBlockスローし、 try ブロックからの例外 ( の例外) は抑制されます。br.close()br.readLine()

ここで私の質問は次のとおりです。2 番目のケースで、 try ブロックから抑制された例外を取得するにはどうすればよいでしょうか?

ソース: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

4

2 に答える 2

6

基本的に、できません。br.close()スローされた場合、抑制された例外は失われます。

最も近いのはcatch、値を locla 変数に代入するブロックを作成することです。

static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
    IOException exception = null;
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
      return br.readLine();
    } catch (IOException e) {
      exception = e;
    } finally {
      try {
        if (br != null) br.close();
      } catch (IOException e) {
        // Both the original call and close failed. Eek!
        // Decide what you want to do here...
      }
      // close succeeded, but we already had an exception
      if (exception != null) {
        throw exception;
      }
    }
}

...しかし、これは(チェックされていない例外ではなく)処理するだけIOExceptionで、ひどく面倒です。

于 2013-05-10T11:35:59.643 に答える