【Java入門(4)API活用・例外処理 #4】try-catch

 

みのる
こんにちは。笑顔で感謝!✨ みのるコーチです。
今回も、ご覧いただき、ありがとうございます。

今回は…

Java入門4 API活用・例外処理 #4
例外処理
try-catch

というテーマでお送りします。

彩香
今回も頑張ります。よろしくお願いします。
剛留
例外って何だろう?
興味津々です。よろしくお願いします。

【1】 例外処理

例外処理
✅ プログラム実行中に起きた
  エラーの対処。

✅ Javaではエラーが発生すると
  例外オブジェクトが生成される。

✅ その例外オブジェクトに対応した
  処理を行うことが必要。

イメージ的には、こんな感じです。

JVMがエラーを感知すると
例外オブジェクトを作成して
プログラムに 投げ込んでくる

イメージです。

ボールが 投げ入れられます。

プログラムとしては…

どこかで、その例外オブジェクトを キャッチ

して、対処する必要があります。

こうして対処を完了すると
通常の処理に復帰できることとなります。

もし…

例外オブジェクトの対処を行わなかった場合

JVMにその例外オブジェクトは返されて
プログラムは強制終了となってしまいます。

例外処理は、この例外オブジェクトをキャッチして
対処して、通常処理へ復帰させることです。

彩香
確かに、今までは例外処理をしなかったから…

エラーが出ると、コンソールに ずら~って
メッセージが出て強制終了になってましたね。

剛留
審判の人に、アウト~って言われてたんですね。
例外処理、実施していきます。

【2】 例外クラス

発生する例外オブジェクトの元になる

例外クラス

を見ていきましょう。

全ての 例外のスーパークラスは

Objectクラスを 直接継承している Throwableクラス

です。

Throwableクラスを継承しているクラスに

Errorクラスと、Exceptionクラス

があります。

また、Exceptionクラスを継承しているクラスの中に

RuntimeExcepton クラス

があります。

例外の種類は大きく3つに分かれます。

1つ目が Error クラスを継承しているクラスで

2つ目が、RuntimeException以外で Exceptionクラスを
継承しているクラス。

3つ目が、RuntimeExceptionを継承しているクラスです。

1つ目の Errorクラスを継承しているクラス

は 例えば、OutOfMemoriyError という
メモリ不足によるエラーがあります。

「エラー系」と呼ばれますが この部分は、プログラムで
回復できない問題なので 対処する範囲外となります。

2つ目の分類を「検査例外」といいます。

こちらは、対処を行わないとコンパイルエラーになります。
例外処理必須です。

例えば ファイルなど入出力時にエラーが発生する
IOException があります。

入出力では例外の可能性が
残ってしまうため「検査例外」となっているのです。

「対応必須」の例外です。

3つ目の分類は「非検査例外」です。

こちらの対処は 任意です。

例えば、文字列数値変換の
Integer.parseInt(String s) を実行する時に…

文字列に数値以外が含まれていた場合に
発生する例外 NumberFormatException があります。

こちらは、可能性があればエラーの
対処(例外処理)を行います。

ただし、例えば 元になる文字列の入力処理で
必ず数字のパターンで 入力される場合には…

例外処理を行わなくても問題ありません。
もちろん、コンパイルエラーにも なりません。

こちらは「対応任意」の例外です。
必要に応じて対応するという意味です。

もう一度言うと、例外の分類は
この3種類です。

例外の分類
① エラー系は、プログラムの対応範囲外。
② 検査例外は、対応必須。(コンパイラがチェック)
③ 非検査例外は、対応任意。(必要に応じて対応)

【3】 対処方法

発生する可能性のある例外について
Javaでは、大きく2つの対処方法が用意されています。

1つ目は「キャッチする。」

例外が発生したら、メソッド内で
対処する方法です。

例外のボールが飛んできたら
すかさず キャッチして対処します。

発生した例外を ここで解消して
通常の処理に戻します。

もう一つは「投げる」。

例外の対処を行わずに
メソッドの呼び出し元に 対処を委ねる方法です。

例外のボールが飛んできたら、このメソッドでは対処せず
呼び出し元にボールを投げる イメージです。

この場合でも、メソッド呼び出しの階層の
どこかで 例外をキャッチして対応する必要があります。

そして、このうち 後者の 呼び出し元に対処を
委ねるほうは、次回にお話します。

今回は…

前者の、メソッド内で 対処する方法

を 見ていきましょう。

Javaでは、try-catch構文で実現します。

彩香
メソッド呼び出し元に、投げる方法もあるんですね。

プログラムの、どこかでキャッチするイメージ
何となく分かります。

剛留
今回は、まず キャッチするほうですね。
バッチシ、習得してしまいますよ~。

【4】 try-catch

try {

 (例外が発生する可能性のある処理)

} catch (例外クラス名 例外変数名) {

 (例外発生時の処理)

} finally {

 (最後に必ず行いたい処理)

}

try-catch 構文は、このように記述します。

キーワード try の後に、ブロックを書いて
この中に 例外が発生する可能性のある処理を記述します。

そして、try ブロックの後に

キーワード catch を書いて 丸括弧
この丸括弧の中に キャッチしたい例外クラス名と
キャッチした例外を格納する変数名を書きます

この変数名は e を使用するのが一般的です。

そして、その後にブロックを書きます。
このブロックの中に、例外発生時の処理を記述します。

また、この catch ブロックは複数記述することができます。
複数の例外の種類を catch したい場合の記述です。

最後に、catch ブロックの後に キーワード finally を書いて
その後にブロックを 記述する事ができます。

このブロックには、ファイルやネットワーク接続を
クローズしたりなど 必ず最後に行いたい処理を記述します。

ただし、この finally ブロックは 省略可能です。

彩香
try-catch そして finally の構文、理解しました。
剛留
キャッチする方法、バッチシです。
次回の、投げるほうも楽しみです。

【まとめ】

【1】 例外処理
✅ プログラム実行中に起きた
  エラーの対処。

✅ 生成された例外オブジェクトに
  対応した処理を 行います。

【2】 例外クラス
✅ エラー系は
  プログラムの対応範囲外。

✅ 検査例外は、対応必須。
 (コンパイラがチェック)

✅ 非検査例外は、対応任意。
 (必要に応じて対応)

【3】 対処方法
✅ 対処方法は2つ

  ① メソッド内でキャッチする
  ② 呼び出し元に投げる

【4】 try-catch
✅ try ブロックに、例外が発生する
  可能性のある処理を記述。

✅ catch で例外クラスを指定して
  ブロックの中で、対処処理を記述。

✅ finally ブロックには
  必ず行いたい処理を記述する。