2016-08-26 18 views
3

「リソースを試してみよう」のトピックに疑問を呈しました。リソースを試してみてください

プログラムコード:

public class Suppressed_Exception_Eg03 
{ 
    public static void main(String[] args) 
    { 
     try (Wolf obj = new Wolf(); Deer obj1 = new Deer();) 
     { 
      //Both close statements are executed . 
      //Therefore , we see two closing stmts 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
} 

static class Wolf implements AutoCloseable 
{ 
    @Override 
    public void close() throws Exception 
    { 
     System.out.println("Closing Wolf !"); 
     throw new RuntimeException("In Wolf !"); 
    } 
} 

static class Deer implements AutoCloseable 
{ 
    @Override 
    public void close() throws Exception 
    { 
     System.out.println("Closing Deer !"); 
     throw new RuntimeException("In Deer !"); 
    } 
} 

出力:

Closing Deer ! 
Closing Wolf ! 
In Deer ! 

・ダウト:我々は、すべての鹿クラスのcloseメソッドが最初に、ウルフクラスのものであろう次閉鎖されることを知っています。したがって、Wolfクラスによってスローされた例外は、Deerクラスによってスローされた例外を抑制するはずです。 したがって、catchブロックでWolfクラスの例外を捕捉する必要があります。しかしここでは出力で見ることができます、Deerクラスの例外が捕捉され、印刷されます。何人かはなぜそれが説明できますか?

+2

同じブロックまたは同じブロックレベルの各行が他のブロックと同じ量だけインデントされていることを確認して、各ブロックに4つのスペースをインデントするようにコードをフォーマットしてください。はい、これはちょっとした要求ですが、私たちはボランティアであり、他の人があなたを助けてくれるように努力したいと思っています。 –

+0

実行時例外により、ユーザーがtryブロックから起動します。これが私のコードと問題であれば、私はバイトコードをチェックします。 –

+1

documenationをリードすると常にとても便利です:[*「資源のcloseメソッドは、その作成の逆の順序で呼び出されることに注意してください。」*](https://docs.oracle.com/javase/tutorial/essential/exceptions/ tryResourceClose.html)... – Tom

答えて

5

スペックは言う:

リソースは、それらが初期化されたことから、逆の順序で閉じられています。 リソースは、null以外の値に初期化された場合にのみクローズされます。 1つのリソースのクローズからの例外は、他のリソースのクローズを防ぎません。以前にイニシャライザ、tryブロック、またはリソースのクローズによって例外がスローされた場合、そのような例外は抑制されます。

例外がスローされていないため、コード(Deer)の最初の例外は表示されません。次に、次のリソースが閉じられます(Wolf)が、今度はWolfの例外が抑制されます。

+0

こんにちはデビッド、私は知らなかった "1つのリソースの閉鎖からの例外は、他のリソースの閉鎖を防ぎません"と "例外は、イニシャライザ、tryブロック、またはリソースのクローズ "を示します。そうであれば、出力は正当化されます。 Davidに感謝します! –

関連する問題