web-dev-qa-db-ja.com

try-finallyとtry-catchの違い

の違いは何ですか

try {
    fooBar();
} finally {
    barFoo();
}

そして

try {
  fooBar();
} catch(Throwable throwable) {
    barFoo(throwable); // Does something with throwable, logs it, or handles it.
}

Throwableにアクセスできるので、2番目のバージョンの方が好きです。 2つのバリエーションの間に論理的な違いや優先規則はありますか?

また、finally句から例外にアクセスする方法はありますか?

81
Vijay Kotari

これらは2つの異なるものです。

  • Catchブロックは、tryブロックで例外がスローされた場合にのみ実行されます。
  • Finallyブロックは、例外がスローされるかどうかにかかわらず、常にtry(-catch)ブロックの後に実行されます。

あなたの例では、3番目の可能な構造を示していません。

try {
    // try to execute this statements...
}
catch( SpecificException e ) {
    // if a specific exception was thrown, handle it here
}
// ... more catches for specific exceptions can come here
catch( Exception e ) {
    // if a more general exception was thrown, handle it here
}
finally {
    // here you can clean things up afterwards
}

また、@ codecaがコメントで述べているように、finallyブロックは例外がなくても実行されるため、finallyブロック内の例外にアクセスする方法はありません。

もちろん、ブロック外で例外を保持する変数を宣言し、catchブロック内で値を割り当てることができます。その後、finallyブロック内でこの変数にアクセスできます。

Throwable throwable = null;
try {
    // do some stuff
}
catch( Throwable e ) {
    throwable = e;
}
finally {
    if( throwable != null ) {
        // handle it
    }
}
112
tangens

これらはバリエーションではなく、根本的に異なるものです。 finallyが実行されますalwayscatchは例外が発生した場合のみ。

11

最後に、catchブロックはまったく異なります。

  • Catchブロック内で、スローされた例外に応答できます。このブロック未処理の例外がある場合にのみ実行されますで、タイプがcatchブロックのパラメーターで指定されたものと一致するか、指定されたサブクラスです。
  • 最終的には常に実行されます try and catchブロックの後、例外が発生したかどうかに関係なくブロックします。

そう

try {
  //some code
}
catch (ExceptionA) {
  // Only gets executed if ExceptionA 
  // was thrown in try block
}
catch (ExceptionB) {
  // Only executed if ExceptionB was thrown in try 
  // and not handled by first catch block
}

とは異なり

try {
  //some code
}
finally {
  // Gets executed whether or not 
  // an exception was thrown in try block
}

かなり。

Tryブロックを定義する場合は、定義する必要があります

  1. 最後に1つのブロック、または
  2. 1つ以上のcatchブロック、または
  3. 1つまたは複数のcatchブロックと1つのfinallyブロック

したがって、次のコードも有効です。

try {
  //some code
}
catch (ExceptionA) {
  // Only gets executed if 
  // ExceptionA was thrown in try block
}
catch (ExceptionB) {
  // Only executed if ExceptionB was thrown in 
  // try and not handled by first catch block
}
//even more catch blocks
finally {
  // Gets executed whether or not an 
  // exception was thrown in try block
}
7
TheMorph

最後に、catchブロックはまったく異なります。

Catchブロック内で、スローされた例外に応答できます。このブロックは、未処理の例外があり、タイプがcatchブロックのパラメーターで指定されたものと一致するか、指定されたサブクラスである場合にのみ実行されます。最後に、例外が発生したかどうかに関係なく、try and catchブロックの後に常に実行されます。

4

tryは、例外をスローする可能性のあるメソッドを実行するために使用されます

catchは、その例外を「キャッチ」するために使用されます

最後に、キャッチされているかどうかに関係なく、例外から必要なクリーンアップに使用されます

try{
    myObject.riskyMethod(); // run a method that may throw an exception
}
catch(Exception ex){
    myLogger.log(ex.Message); // "catch" stop that exception
}
finally{
    myObject = null; // clean up needed from that exception being caught
}
4
Kieran
try {
    statements;
} catch (exceptionType1 e1) {      // one or multiple
    statements;                 
} catch (exceptionType2 e2) {
    statements;
}    
...
} finally {                                 // one or none
    statements;
}
  1. すべてのtryステートメントには、1つのcatch節またはfinally節のいずれかを含める必要があります
  2. 複数のcatch句を使用できますが、finally句は1つだけです
  3. 実行中にエラーが発生すると、コントロールは適切なCatchブロックに転送され、ステートメントを実行し、Finallyブロックが実行されます。

The Finalブロックは常に実行されるため、セッション、データベース接続、ファイルまたはソケットが開いている場合は、一般的に、Finallyブロックが使用されます。これらの接続を閉じるためのコードが配置されます。これは、アプリケーションでメモリリークやその他の問題が発生しないようにするためです。

4
gmhk

私の研究では、最後にブロックは常に実行され、主に「開いている接続を閉じて不必要に実行されているものを破棄するために使用されます」。

3
Hari krishna

最後に、ブロックが常に実行されます。 Catchブロックは、blocksパラメーターに一致する例外がキャッチされた場合にのみ実行されます。

2
mkorpela

最初のフォームでも、呼び出し元のメソッドに記録できます。そのため、そこで特別な処理を行う場合を除き、大きな利点はありません。

2
fastcodejava

一般に、ストリームや接続などのリソースを使用する場合、finallyブロックを使用して明示的に閉じる必要があります。以下のプログラムでは、FileReaderを使用してファイルからデータを読み取り、finallyブロックを使用してデータを閉じています。

import Java.io.File;
import Java.io.FileReader;
import Java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]){
      FileReader fr=null;       
      try{
         File file=new File("file.txt");
         fr = new FileReader(file);  char [] a = new char[50];
         fr.read(a); // reads the content to the array
         for(char c : a)
         System.out.print(c); //prints the characters one by one
      }catch(IOException e){
          e.printStackTrace();
       }
       finally{ 
          try{
              fr.close();
          }catch(IOException ex){       
               ex.printStackTrace();
           }
       }
    }

}

たぶん私のような他の人がこのようなものを探しました。

このページの情報 tutpoint

2
Florian Neiss