try catch finally
このチュートリアルでは、Javaで例外処理に使用される、Try、Catch、Finally、Throw、Throwsなどのさまざまなキーワードについて例を挙げて説明します。
以前のチュートリアルでは、Javaでの例外処理の基本と、JavaExceptionクラスでサポートされるさまざまな例外について説明しました。また、NullPointerExceptionについても詳しく説明しました。
Javaで提供されている特定のキーワードを使用して、プログラムに例外を含めることができます。これらのキーワードは、例外の定義と処理を容易にするさまざまなコードブロックを定義します。
=> 独占的なJavaトレーニングチュートリアルシリーズについては、こちらをご覧ください。
学習内容:
試して、キャッチして、最後にJavaで
以下のキーワードは、Javaで例外処理に使用されます。
- 試してみてください
- キャッチ
- 最後に
- スロー
- 投げる
次の表で、これらのキーワードについて簡単に説明します。
キーワード | 説明 |
---|---|
試してみてください | 「Try」キーワードを使用して、特別なブロックで例外を発生させる可能性のあるコードのブロックを指定します。 |
キャッチ | 例外が発生した場合、プログラムによってキャッチされる必要があります。これは、「catch」キーワードを使用して行われます。したがって、catchブロックは、例外を発生させるtryブロックの後に続きます。キーワードcatchは、常にtryで使用する必要があります。 |
最後に | プログラムには、例外がスローされるかどうかに関係なく実行する必要のある重要なコードがある場合があります。このコードは、「Finally」キーワードで始まる特別なブロックに配置されます。 Finalブロックは、Try-catchブロックの後に続きます。 |
スロー | キーワード「throw」は、例外を明示的にスローするために使用されます。 |
投げる | キーワード「Throws」は例外をスローしませんが、例外を宣言するために使用されます。このキーワードは、プログラムまたはメソッドで例外が発生する可能性があることを示すために使用されます。 |
このチュートリアルでは、プログラミング例とともに、上記のすべてのキーワードについて詳しく説明します。
JavaでBlockを試す
プログラムを作成しているときはいつでも、例外をスローする可能性があると思われるコードが存在する可能性があります。 例えば、 例外をスローするコードに「ゼロ除算」操作があるのではないかと疑うかもしれません。
例外を発生させる可能性のあるこのコードは、キーワード「try」でブロックに囲まれています。したがって、tryブロックには、例外を発生させる可能性のあるコードまたはステートメントのセットが含まれています。
tryブロックの一般的な構文は次のとおりです。
try{ //set of statements that can raise exception }
したがって、プログラマーが特定のステートメントで例外が発生すると考える場合は、これらのステートメントをtryブロックで囲みます。 tryブロック内の特定のステートメントで例外が発生した場合、残りのコードは実行されないことに注意してください。
特定のステートメントのtryブロックで例外が発生すると、コントロールが出て、プログラムが突然終了します。このプログラムの突然の終了を防ぐには、この例外を「処理」する必要があります。この処理は、「catch」キーワードを使用して行われます。したがって、tryブロックには常にcatchブロックが続きます。
Javaでブロックをキャッチ
例外を処理するためにcatchブロックを使用します。これは、「catch」キーワードを持つブロックです。 catchブロックはtryブロックの後に続きます。
tryブロックで例外が発生するたびに、例外に対応するcatchブロックのコードが実行されます。
catchブロックの一般的な構文は次のとおりです。
catch (Exception e){ //code to handle exception e }
一般に、宣言された例外は、すべての例外の親クラス、つまりExceptionである必要があります。ただし、複数の例外がある場合は、特定の例外タイプまたは生成された例外を作成することもできます。
次に、try-catchブロックについて説明します。各tryブロックに対して、複数のcatchブロックを持つことができることに注意してください。
トライキャッチJava
try-catchブロックの一般的な構文を以下に示します。
try{ //code causing exception } catch (exception (exception_type) e (object)) { //exception handling code }
tryブロックには、複数の例外を発生させる可能性のある複数行のコードを含めることができます。これらの各例外は、独立したcatchブロックによって処理されます。
汎用例外ハンドラーであるExceptionクラスのオブジェクトeはすべての例外を処理できますが、特定の例外を処理する場合は、最後のキャッチブロックとして汎用例外ハンドラーを指定することをお勧めします。
Java TryCatchの例
それでは、Javaでtry-catchブロックをデモンストレーションしましょう。ここで、tryブロックで、除算演算を定義します。除数はゼロです。したがって、2つの数値を除算するステートメントは、算術例外を発生させます。算術例外のハンドラーを定義するcatchブロックがあります。
以下にJavaプログラムの例を示します。
class Main { public static void main(String args()) { int val1, val2; try { //this block will contain statements that may raise exceptions System.out.println('Try Block:: Start'); val1 = 0; val2 = 25 / val1; System.out.println(val2); System.out.println('Try Block:: End'); } catch (ArithmeticException e) { //handler for ArithmeticException System.out.println('ArithmeticException :: Divide by Zero!!'); } System.out.println('Outside try-catch:: Rest of the code.'); } }
出力
例を挙げた機能テストとは
複数の例外をキャッチする
すでに述べたように、tryブロックには、複数の例外を発生させるコードを含めることができます。この場合、各例外を処理するために複数のcatchブロックが必要になります。単一のtryブロックの後に、複数のcatchブロックを続けることができます。各catchブロックは、独立した例外を処理します。
複数のキャッチブロックの場合、以下の点を覚えておく必要があります。
- Javaプログラムでは、いつでも1つの例外しか発生しません。また、どの時点でも、1つのcatchブロックのみが実行されます。
- 複数のcatchブロックは、最も具体的な例外のcatchブロックが最初に来て、次に一般的なものになるように順序付けする必要があります。
例えば、 ArithmeticExceptionと一般的なExceptionがある場合、ArithmeticExceptionを処理するcatchブロックが最初に来て、次にExceptionを処理するcatchブロックが続きます。
以下の例は、複数のキャッチブロックを示しています。
public class Main { public static void main(String() args) { //try block containing exception prone code try{ System.out.println('try Block:: Begin'); int myArray()=new int(5); myArray (5)=10/0; } //multiple catch blocks catch(ArithmeticException e) { System.out.println('Arithmetic Exception :: Divide by zero!!'); } catch(ArrayIndexOutOfBoundsException e) { System.out.println('ArrayIndexOutOfBounds :: Accessed index out of bounds'); } catch(Exception e) { System.out.println('Exception :: ' + e.getMessage ()); } System.out.println('rest of the code'); } }
出力
上記のプログラムでは、最初のcatchブロックでキャッチされたArithmeticExceptionが発生します。このcatchブロックが指定されていない場合、例外は一般化されたcatchブロックに伝播されます。
上記のプログラムを少し変更して、tryブロックで2つの例外が発生するようにします。次に、出力を見てみましょう。
public class Main { public static void main(String() args) { //try block containing exception prone code try{ System.out.println('try Block:: Begin'); int myArray()=new int(5); System.out.println('Array element 10 : ' + myArray(10)); myArray(5)=10/0; } //multiple catch blocks catch(ArithmeticException e) { System.out.println('Arithmetic Exception :: Divide by zero!!'); } catch(ArrayIndexOutOfBoundsException e) { System.out.println('ArrayIndexOutOfBounds :: Accessed index out of bounds'); } catch(Exception e) { System.out.println('Exception :: ' + e.getMessage ()); } System.out.println('rest of the code'); } }
出力
この出力が表示される場合は、ArrayIndexOutOfBoundsExceptionがスローされていることを示しています。これは、ArrayIndexOutOfBoundsExceptionを発生させるステートメントが最初に実行されるためです。例外がスローされ、制御は対応するキャッチブロックに移動します。
ネストされたトライキャッチ
別のtryブロック内のtryブロックは、ネストされたtryブロックと呼ばれます。 tryコードに含まれるコードの一部が特定の例外を発生させ、別のコードが完全に異なる例外を発生させるような特定の状況では、このような構造が必要です。
ネストされたtryブロックの場合、最初に最も内側のtryブロックが実行され、例外が処理されます。最も内側のtryブロックに一致するcatchブロックがない場合は、親のtryブロックまで1レベル伝播されます。このようにして、一致する例外ハンドラーが見つかるまで、例外が上方に伝播されます。
例外に一致する例外ハンドラーがない場合、プログラムはシステム生成メッセージで突然終了します。
ネストされたtryブロックの一般的な構文を以下に示します。
try { //try_block 1; try { //try_block 2; } catch(Exception e) { //exception handler code } } catch(Exception e) { //exception handler code }
ネストされたtry-catchブロックを示すプログラムを実装しましょう。
class Main{ public static void main(String args()){ //Main try block try{ //try block1 try{ System.out.println('Try Block1'); int num =15/0; System.out.println(num); } catch(ArithmeticException e1){ System.out.println('Block1 Exception: e1'); } //try block2 try{ System.out.println('Try Block2'); int num =100/0; System.out.println(num); } catch(ArrayIndexOutOfBoundsException e2){ System.out.println('Block2 Exception: e2'); } System.out.println('General statement after Block1 and Block2'); } catch(ArithmeticException e3){ System.out.println('Main Block Arithmetic Exception'); } catch(ArrayIndexOutOfBoundsException e4){ System.out.println('Main Block ArrayIndexOutOfBoundsException'); } catch(Exception e5){ System.out.println('Main Block General Exception'); } System.out.println('Code after Nested Try Block'); } }
出力
上記のプログラムでは、メインのtryブロックで囲まれた2つのtryブロックがあります。両方の内部tryブロックには、ArithmeticExceptionを発生させるコードがあります。ただし、一致するcatchブロックは、最初のブロックにのみ提供され、2番目のtryブロックには提供されていません。
したがって、2番目のブロックはその例外をメインのtryブロックに伝播し、それを処理します。これは出力から明らかです。
最後にJavaでブロック
これまで、try-catchとネストされたtryブロックを見てきました。例外を発生させると予想されるコードがtryブロックに入れられることがわかっています。例外が発生すると、tryブロックの残りのコードは実行されません。
例外が処理されない場合、プログラムが突然終了するか、制御が例外ハンドラーに渡されます。
このような状況では、例外が発生するかどうかに関係なく実行されるコードを含める必要が生じます。これは、例外が発生した場合でも、例外が発生しなかった場合でも、コードの一部を実行することを意味します。
ただし、例外が発生した後にtryブロックが終了するため、このコードをtryブロックに入れることはできません。同様に、catchブロックには例外ハンドラーがあるため、これをcatchブロックに入れることもできません。
したがって、例外が発生するかどうかに関係なく実行されるコードを含む別のブロックが必要です。 Javaは、このコードを含む「最終的に」ブロックを提供します。
したがって、Javaのfinallyブロックには、プログラムで実行される重要なステートメントを含めることができます。これらのステートメントの実行は、例外が発生したかどうかに関係なく実行する必要があります。
したがって、接続を閉じる、オブジェクトをストリームするなどのコード、またはクリーンアップコードをfinallyブロックに配置して、例外が発生した場合でも実行できるようにします。
Javaのfinallyブロックは通常、tryまたはcatchブロックの後に配置されます。 finalブロックはtryブロックなしでは存在できないことに注意してください。 finalブロックがtry-catchに含まれている場合、「 try-catch-finally 」ブロック。
例外処理コードのfinallyブロックをスキップできます。これは、finallyブロックがオプションであることを意味します。
tryブロックで例外が発生しない場合、finallyブロックはtryブロックの後に実行されます。 tryブロックに例外がある場合、制御は最初にcatchブロックに渡され、次にfinallyブロックに渡されます。
finishブロックで発生する例外は、他の例外と同じように動作します。 tryブロックにreturnステートメントまたはbreakやcontinueなどの分岐ステートメントが含まれている場合でも、finallyブロックは実行されます。
これらの点を念頭に置いて、le’sはfinallyブロックの一般的な構文と例を進めます。
finishブロックの一般的な構文は次のとおりです。
try { //code that might raise exception }catch { //code that handles exception }finally { //mandatory code to be executed }
最終的にブロックは常に実行されますが、実行されない場合もあります。
これらは以下の場合です:
- スレッドが死んでいるとき。
- System.exit()メソッドを使用する場合。
- finishブロックで例外が発生したとき。
いくつかのプログラムを実装して、finallyブロックを示しましょう。
class Main { public static void main (String args()) { //try block try { System.out.println ('::Try Block::'); int data = 125 / 5; System.out.println ('Result:' + data); } //catch block catch (NullPointerException e) { System.out.println ('::Catch Block::'); System.out.println (e); } //finally block finally { System.out.println (':: Finally Block::'); System.out.println ('No Exception::finally block executed'); } System.out.println ('rest of the code...'); } }
出力
上記のプログラムは、try-catch-finallyブロックを示しています。 tryブロックでは、有効な操作が実行されるため、例外はスローされません。したがって、制御は試行からキャッチするためではなく、最終的にブロックするために渡されます。
次のプログラムは、try-catch-finallyブロックの別の例ですが、この場合、ゼロ除算操作を実行すると、tryブロックで例外がスローされます。したがって、finallyブロックは、trycatchブロックが実行された後に実行されます。
class Main { public static void main(String args()) { //try block try{ System.out.println('::Try block::'); int num=67/0; System.out.println(num); } //catch block catch(ArithmeticException e){ System.out.println('::Catch block::'); System.out.println('ArithmeticException::Number divided by zero'); } //finally block finally{ System.out.println('::Finally block::'); } System.out.println('Rest of the code continues...'); } }
出力
Javaで例外をスローする
Javaには、コードで例外を明示的にスローできるキーワード「throw」が用意されています。 例えば、 算術演算をチェックしていて、オペランドをチェックした後にいくつかの例外を発生させたい場合は、「throw」キーワードを使用して行うことができます。
throwキーワードを使用すると、チェックされた例外またはチェックされていない例外をスローできます。 throwキーワードは、カスタム例外をスローするためにも使用されます。
throwキーワードの一般的な構文は次のとおりです。
throw exception; or throw new exception_class('error message');
以下に、throwキーワードを示すプログラムの例を示します。
public class Main{ static void validate_Age(int age){ //if specified age is <18, throw ArithmeticException if(age<18) throw new ArithmeticException('Not eligible to vote and drive!!'); else //print the message System.out.println('Eligible to vote and drive!!'); } public static void main(String args()){ //call validate_Age method validate_Age(10); System.out.println('rest of the code...'); } }
出力
上記のプログラムでは、年齢を検証する方法を使用しています。年齢が<18, then an exception is thrown to indicate the age is not valid.
条項をスローします
例外を宣言するためのtryブロックを見てきました。例外を発生させる可能性のあるコードが含まれています。例外を宣言する別の方法があり、「throws」キーワードを使用しています。
「throws」キーワードを使用した例外の宣言は、「throws」キーワードの後に例外が指定されている可能性があることをプログラマーに通知します。プログラマーは、プログラムの通常のフローを維持するために、この例外に対応するハンドラーコードを提供する必要があります。
ただし、例外を宣言して処理するためのより信頼性の高いtry-catchブロックがあるのに、なぜ「throws」キーワードが必要なのかという疑問が生じます。
1つの理由は、発生する可能性のある例外の数が増えると、1つのcatchブロックが1つの例外しか処理できないため、例外を処理するcatchブロックの数も増えるためです。
同様に、プログラムに多くのメソッドがあり、各メソッドに多数の例外がある場合、コードは不必要に長くなり、管理できなくなります。
したがって、メソッドシグネチャでthrowsキーワードを使用して例外を宣言し、try-catchを使用してメソッド呼び出しを処理することは、実行可能な解決策のようです。
throwsキーワードを使用して例外を宣言することの別の利点は、例外を処理することを余儀なくされることです。宣言された例外のハンドラーを提供しない場合、プログラムはエラーを発生させます。
throwsキーワードの一般的な構文は次のとおりです。
return_type method_name() throws exception_class_name{ //method code }
ここで、「throws」キーワードを示すJavaプログラムを実装しましょう。
このプログラムには、メソッドtestMethodを持つクラスExample_throwがあります。このtestMethodのシグニチャでは、throwsキーワードを使用して、IOExceptionとArithmeticExceptionの2つの例外を宣言します。次に、main関数で、スローされた例外はcatchブロックによって処理されます。
import java.io.*; class Example_Throw { //declare exception using throws in the method signature void testMethod(int num) throws IOException, ArithmeticException{ if(num==1) throw new IOException('IOException Occurred'); else throw new ArithmeticException('ArithmeticException'); } }class Main{ public static void main(String args()){ try{ //this try block calls the above method so handle the exception Example_Throw obj=new Example_Throw(); obj.testMethod(1); }catch(Exception ex){ System.out.println(ex); } } }
出力
よくある質問
Q#1)Javaでthrows throw VS try-catchを使用するのはいつですか?
回答: 「throws」キーワードは、メソッドシグネチャで例外を宣言するために使用されます。 throwキーワードは、例外を明示的にスローするために使用されます。 try-catchブロックは、他のユーザーによってスローされた例外を処理するために使用されます。
Q#2)スローを使用して、1つの方法で試してキャッチすることはできますか?
回答: いいえ。例外をスローしたり、同じメソッドでキャッチしたりすることはできません。 throwsを使用して宣言された例外は、例外をスローしたメソッドを呼び出す呼び出しメソッドで処理されます。
Q#3)catchブロックが例外をスローするとどうなりますか?
回答: catchブロックで例外がスローされると、プログラムは実行を停止します。プログラムを続行する必要がある場合は、catchブロックで発生した例外を処理するために、別のtry-catchブロックが必要です。
Q#4)Javaのtry-catch-finallyとは何ですか?
回答: try-catch-finallyブロックには、tryブロック、catchブロック、finallyブロックの3つのブロックが含まれます。
tryブロックには、例外をスローする可能性のあるコードが含まれています。 Catchブロックには、tryブロック内の例外の例外ハンドラーが含まれています。 finishブロックには、例外が発生したかどうかに関係なく実行される重要なコードが含まれています。
Q#5)最終的にブロックはtry-catchを持つことができますか?
C ++でintにchar
回答: はい、finallyブロックで例外をスローする可能性のあるクリーンアップコードがある場合は、try-catchブロックを使用できます。しかし、それは醜いように見えます。
結論
このチュートリアルでは、Javaの例外処理で使用されるさまざまなキーワードについて説明しました。 try、catch、finally、throw、throwsなどのキーワードについて説明しました。
例外をスローする可能性のあるコードはtryブロックで囲まれ、catchは例外のハンドラーを提供します。 finishブロックは、例外がスローされるかどうかに関係なく、それに含まれるコードを実行します。 finalブロックは通常、tryまたはtry-catchブロックの後に続きます。
throwsキーワードを使用して、メソッドシグネチャで例外を宣言し、throwを明示的に使用して例外をスローします。通常、throwキーワードを使用してカスタム例外をスローします。
=> ここで完璧なJavaトレーニングガイドをチェックしてください。