の違いは何ですか
try {
fooBar();
} finally {
barFoo();
}
そして
try {
fooBar();
} catch(Throwable throwable) {
barFoo(throwable); // Does something with throwable, logs it, or handles it.
}
Throwableにアクセスできるので、2番目のバージョンの方が好きです。 2つのバリエーションの間に論理的な違いや優先規則はありますか?
また、finally句から例外にアクセスする方法はありますか?
これらは2つの異なるものです。
あなたの例では、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
}
}
これらはバリエーションではなく、根本的に異なるものです。 finally
が実行されますalways、catch
は例外が発生した場合のみ。
最後に、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ブロックを定義する場合は、定義する必要があります
したがって、次のコードも有効です。
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
}
最後に、catchブロックはまったく異なります。
Catchブロック内で、スローされた例外に応答できます。このブロックは、未処理の例外があり、タイプがcatchブロックのパラメーターで指定されたものと一致するか、指定されたサブクラスである場合にのみ実行されます。最後に、例外が発生したかどうかに関係なく、try and catchブロックの後に常に実行されます。
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
}
try {
statements;
} catch (exceptionType1 e1) { // one or multiple
statements;
} catch (exceptionType2 e2) {
statements;
}
...
} finally { // one or none
statements;
}
The Finalブロックは常に実行されるため、セッション、データベース接続、ファイルまたはソケットが開いている場合は、一般的に、Finallyブロックが使用されます。これらの接続を閉じるためのコードが配置されます。これは、アプリケーションでメモリリークやその他の問題が発生しないようにするためです。
私の研究では、最後にブロックは常に実行され、主に「開いている接続を閉じて不必要に実行されているものを破棄するために使用されます」。
最後に、ブロックが常に実行されます。 Catchブロックは、blocksパラメーターに一致する例外がキャッチされた場合にのみ実行されます。
最初のフォームでも、呼び出し元のメソッドに記録できます。そのため、そこで特別な処理を行う場合を除き、大きな利点はありません。
一般に、ストリームや接続などのリソースを使用する場合、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