こんにちは!フリーランスの桃太郎です。
Javaにはエラーが発生した際に、適切な処理を行うための構文としてtry-catch-finallyがあります。
この記事では、
・try-catchとは?
・try-catchの使い方
という基本的な内容から、
・finallyの使い方
・finallyの注意点
などの応用的な使い方に関しても解説していきます。
なお、Javaの記事については、こちらにまとめています。
try-catchとは
javaのプログラミングにおいて、エラーは大きく2つの種類に分けられます。
一つは、javaの書き方自体を誤って起こる文法エラー。
そして、もう一つが、実際にプログラムが実行された時に初めて起こる実行時エラーです。
実行時エラーが起こるとプログラムは後続の処理が行われず、突然止まってしまい、そのシステムを利用しているユーザからすると、何が起きたのかわからない状態となります。
そこで、そのような実行時エラーが起きた場合に、適切な処理をプログラムに指示するための構文がtry-catch文となります。
try-catchの使い方
会員登録して利用するシステムにおいて、ユーザがログインする場面を想定します。
その際、プログラム内では、ログインしようとするユーザがすでに会員なのかどうか判断するためにデータベースにアクセスし情報を確認します。
しかしデータベースへのアクセス処理は予期せぬエラーが発生する可能性があります。
そのような時は以下のようにtry-catch文を使用します。
try { db.open(); Member member = db.executeQuery("/*会員情報を取得するSQL*/"); // ここでDBアクセスエラーが発生する可能性がある db.close(); } catch (SQLException e) { System.out.println("DBアクセスがエラーが発生し、会員情報を正常に取得できませんでした。"); }
try文の中で、正常に処理が行われずDBアクセスエラーが発生した場合、catch文に処理が移動します。
そのcatch文の中にシステムの要件に沿った適切な処理(ここではエラー原因についてメッセージを出力)を実装します。
finallyとは
finallyの使い方
エラーが発生するかしないかに関わらず、確実に行いたい処理が存在する場合があります。
今回の例でいいますと、データベースへ接続するために、データベースへの通信を開始(open)しています。
そして、データが正常に取得できた場合でも、エラーが発生し取得できなかった場合でも、データベースへの通信は閉じる(close)必要があります。
そのような時に使用するのがfinallyです。
次のプログラムでは、tryブロックの処理が正常に行われた場合でも、例外が発生した場合でも、finallyブロックの処理が行われるためクローズ処理が確実に行われます。
try { db.open(); Member member = db.executeQuery("/*会員情報を取得するSQL*/"); } catch (SQLException e) { System.out.println("DBアクセスがエラーが発生し、会員情報を正常に取得できませんでした。"); } finally { db.close(); // クローズ処理 }
finallyの注意点
try-catch-finally文の注意点として、処理の中にreturnを含む場合の処理順序を正しく理解しておく必要があります。
try { db.open(); Member member = db.executeQuery("/*会員情報を取得するSQL*/"); } catch (SQLException e) { System.out.println("DBアクセスがエラーが発生し、会員情報を正常に取得できませんでした。"); return top; // トップ画面に戻る } finally { db.close(); // クローズ処理 System.out.println("クローズ処理を行いました"); }
エラー発生時の実行結果
DBアクセスがエラーが発生し、会員情報を正常に取得できませんでした。 クローズ処理を行いました // トップ画面に戻る
catch文にはエラーメッセージ出力後、トップ画面に戻るreturn処理が実装されています。
ですが、finallyが実装されている場合にはfinally内のクローズ処理が先に実行され、その後にcatch内のreturn処理が行われます。
try catch文の使い方総まとめ
この記事では紹介しきれなかったtry catch文のいろいろな使い方を次の記事にまとめているので、ぜひ確認してください!
まとめ
この記事ではtry-catch-finally構文について解説しました。
適切なエラー処理を行いたい場合はtry-catch-finally構文が必須となりますのでぜひ覚えてください。
もし、try-catch-finally構文について忘れてしまったらこの記事を確認してくださいね!