2016-05-25 7 views
1

てみてください。は、Javaでのリソースと例外

さて、私の理解は正しいです:

tryブロック内の例外は、むしろバブルアップ、飲み込まれることはありませんがあれば、私は、リソースとの試みを使用していても
  • ?それが私がスローキーワードを追加することを余儀なくされた理由ですか?
  • リソースを試してみると、最後にコードを囲み、最後にcatch節を省略するようなものですか?したがって、内部で発生する例外はすべてバブリングされますか?
  • この動作はC言語でも同じですか?
+2

リソースの試行は、チェック例外処理に関して他のコードと変わることはありません。例外を処理する 'catch'ブロックがあります。メソッドが 'throws'すると宣言し、呼び出し側に例外を処理させます。 –

+0

@AndyTurnerしたがってtryリソースを持つcatchブロックはありませんか?すべてそれは閉鎖を保証するだけで、それはそれですか?最後にフックの下でtry ....を使って行われます。 –

+1

@ user200300 'catch'ブロックが必要な場合は' catch'ブロック_を追加する必要があります。 try-with-resourcesでcatchブロックを作成できますが、自動ではありません。はい、それは正しい閉鎖を確実にします。 –

答えて

1

問題の答えが見つかったのかどうかわかりません。私は最近、この質問に遭遇しました。

質問1

使用されるリソースは、例外が処理/キャッチしなければならない(上記の例のように)チェック例外をスローした場合、リソースブロックと試みを使用。 throwsキーワードは、スローされた例外が呼び出し元のメソッドによって処理されるため、エラーをスローしないコンパイラを示します。

質問2.

リソースを試してみてくださいは最終的にのみ未チェックの例外の場合には、チェック例外のためにあなたがキャッチまたは使用を使用して、同じ方法で例外を処理することが期待される試みのように振る舞うだろうに述べたように、それをスローします応答は、Javaでのtry-と-リソースブロック内のリソースを使用するために1

//this works 
public static void writeToFile() throws FileNotFoundException { 
    try (PrintWriter out = new PrintWriter("filename.txt")) { 
     out.println("Hello world"); 
    } 
} 

//this works 
public static void writeToFile() { 
    try (PrintWriter out = new PrintWriter("filename.txt")) { 
     out.println("Hello world"); 
    } 
    catch(FileNotFoundException e) { 
     //handle the exception or rethrow it 
    } 
    finally { 
     //this is optional 
    } 
} 

//this works 
public static void writeToFile() { 
    try (Scanner out = new Scanner(System.in)) { 
     out.println("Hello world"); 
    } 
} 

//this does not work 
public static void writeToFile() { 
    try (PrintWriter out = new PrintWriter("filename.txt")) { 
     out.println("Hello world"); 
    } 
} 
//compiler error: Multiple markers at this line 
- Unhandled exception type IOException thrown by automatic close() 
invocation on out 
- Unhandled exception type IOException 

質問3.

を質問し、インターフェイスAutoCloseableを実装する必要があります。 C#の場合、IDisposeインタフェースはリソースによって実装されます。そのような例の1つがStreamReaderです。 usingブロックは、スコープの終了時にリソースを自動的に閉じますが、エラーを処理することはありません。そのためには、ブロック内でtry-catchを使用する必要があります。例外がキャッチされていない場合

public virtual void Print() 
{ 
    using (StreamWriter reader = new StreamWriter(@"B:\test.txt")) 
    { 
     try 
     { 
      throw new Exception("Hello Exception"); 
     } 
     catch(Exception ex) 
     { 
      throw; 
      //or throw ex; 
     } 
    } 
} 

は、あなたはcatchブロック内のメッセージとIDEによって発生した例外「タイプの未処理の例外 『のSystem.Exception』が発生しました」が表示されます。

C#でJava同等のものが必要な場合は、this linkが役に立ちます。