2016-10-26 3 views
2

私はtry式で作業していましたが、これについてのJavaのドキュメントを読んでいます。 https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
リソースを開くときにリソースをtryしようとするとどうなりますか?

リソースのクローズとtryブロックのコードの両方が例外をスローすると、クローズ例外が抑制されることが分かりました。しかし、リソースのオープンが例外をスローする場合はどうなりますか?私は囲まれたキャッチを使用してそれをキャッチする必要がありますか?これはどのように動作するのですか?

ステートメントを作成するとエラーが発生しましたが、今はどうなりますか?抑圧されていますか?この例外と、文が正常に作成され、ブロックが例外をスローするときにスローされる可能性のある例外を区別したいと思います。

ありがとうございました!

答えて

1

ステートメントを作成するとエラーが発生しましたが、今はどうなりますか?それは が抑制されていますか? createStatement()をスローした場合にあなたが見ることができるように

Throwable primaryExc = null; 
Statement stmt = null; 
try { 
    stmt = con.createStatement(); 
    // use stmt here 
} catch (Throwable e) { 
    primaryExc = e; 
    throw e; 
} finally { 
    if (stmt != null) { 
     if (primaryExc != null) { 
      try { 
       stmt.close(); 
      } catch (Throwable ex) { 
       primaryExc.addSuppressed(ex); 
      } 
     } else { 
      stmt.close(); 
     } 
    } 
} 

:それは抑制されていないん

、それは確かに、それがあるとしてスローされるのJava仕様§14.20.3.1に応じて、あなたのコードは同等です例外、明示的に捕捉されない場合、呼び出し側コードは通常の例外としてこの例外を処理する必要があります。

stmt.close()try-with-resourcesステートメントで自動的に呼び出されている間に例外をスローした場合、上記の同等のコードスニペットと同様に、呼び出しコードはこの例外も処理されないため、この例外を処理する必要があります。

例外を抑制する能力は、例えば、例外がすでにtryブロックでスローされたとき、リソースのclose()を呼び出し中にスローされていた例外を取得することができるようにtry-with-resources文に追加されました

try (Statement stmt = con.createStatement()) { 
    throw new RuntimeException("foo"); 
} catch (Exception e) { 
    // Here e is my RuntimeException, if stmt.close() failed 
    // I can get the related exception from e.getSuppressed() 
} 
関連する問題