try-catch-finally文は、例外処理を行うための構文です。
try-catch-finally句について
try~catch~finally文は、例外(Exception)が発生することを事前に予測して、発生した時の処理を記述しておくときに使用する文法です。
まず、try~catchの間に例外が発生する可能性がある処理を記述し、catchに発生した例外ごとの処理を記述します。
finallyに書いた処理は、例外が発生してもしなくても必ず実行されます。
catchした例外はthrow句を使って呼び出し元に投げることもできます。
try-catch-finally構文
try-catch-finally句の構文と、ブロック毎の解説です。
try {
//例外が発生する可能性がある処理
} catch(<例外クラス> <変数名>) {
//例外が発生した場合の処理
} finally {
//例外が発生してもしなくても必ず実行したい処理
}
ブロック | 解説 |
---|---|
try | 例外が発生する可能性のあるコードを記述します。例外が発生すると、このブロック内の処理が中断され、対応するcatchブロックが実行されます。 |
catch | tryブロックで発生した例外をキャッチし、適切な処理を行います。複数のcatchブロックを使って、異なる例外に対する処理を個別に記述することもできます。 |
finally | 例外の発生の有無にかかわらず必ず実行したい処理を記述します。例えば、ファイルのクローズやリソースの解放など必ず行いたい処理をここに書きます。finally句は複数定義できません。 |
※try、catch、finallyは必ずしもすべてのブロックを指定する必要はありません。
以下の3パターンのいずれかで指定できます。
- try-catch-finally
- try-catch
- try-finally
※try-catch-finallyの順番は変更できません。
try-catch-finallyサンプルソース
- (引き数を2つ受け取り割り算をする)
-
public class TryCatchSample { public static void main(String args[]) { try { //引数を受け取る(引数が取れない可能性あり) String a = args[0]; String b = args[1]; //int型に変換する(int型に変換できない可能性あり) int val1 = Integer.parseInt(a); int val2 = Integer.parseInt(b); //割り算をする(ゼロ除算の可能性あり) int result = val1 / val2; //結果表示する System.out.println(result); } catch(ArrayIndexOutOfBoundsException ex) { //ArrayIndexOutOfBoundsExceptionが発生した時の処理 System.out.println("引数の個数が足りません。"); } catch(NumberFormatException ex) { //NumberFormatExceptionが発生した時の処理 System.out.println("数値ではありません。"); } catch(ArithmeticException ex) { //ArithmeticExceptionが発生した時の処理 System.out.println("ゼロ除算です。"); } catch(Exception ex) { //上記以外の例外が発生した時の処理 System.out.println("予期せぬエラーが発生しました。"); ex.printStackTrace(); } finally { //例外の発生如何に関わらず実行する処理 System.out.println("終了"); } } }
- 実行結果 (引数を渡さない場合)
- C:\>java TryCatchSample 引数の個数が足りません。 終了
- 実行結果 (数値ではない引数を渡した場合)
- C:\>java TryCatchSample A B 数値ではありません。 終了
- 実行結果 (ゼロ除算になるような引数を渡した場合)
- C:\>java TryCatchSample 10 0 ゼロ除算です。 終了
- 実行結果 (例外にならないような引数を渡した場合)
- C:\>java TryCatchSample 10 2 5 終了
try-catch-finallyまとめ
- 例外発生時の処理を記述するための構文
- 発生した例外毎に分けて処理を記述できる
- 例外の発生有無に関わらず実行したい処理はfinally句に記述する
- catchした例外をthrow句を使用して呼び出し元に投げることも可能
(その場合はメソッドにthrows句の記述が必要) - catch内でreturnしている場合、finally内の処理が行われた後でreturnされる。
- catch句とfinally句の両方でreturnしている場合は、finally句で返している値が有効。
- finallyブロックが実行されないのは、
System.exitで強制終了した時と、JVMやOSがクラッシュしたときのみ。
コメント