try-catch-finally

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-finally句のブロック】
ブロック解説
try例外が発生する可能性のあるコードを記述します。例外が発生すると、このブロック内の処理が中断され、対応するcatchブロックが実行されます。
catchtryブロックで発生した例外をキャッチし、適切な処理を行います。複数の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がクラッシュしたときのみ。

コメント

タイトルとURLをコピーしました