【はじめてのJava】例外の対応【例外処理編】
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
例外の対応
前回の記事で、例外の種類について紹介しました。
今回は具体的に例外をどのように処理するかを解説していきます。
目次
例外の対応
例外処理が必須な例外が発生した際には、2つのパターンの対処方法があります。
「例外に対処する(その場で対処する)」と「例外を逃れる(別の箇所に例外処理を任せる)」の2つのパターンで例外を処理します。
今回は、「例外に対処する(その場で対処する)」パターンを解説していきます。
例外に対処する
「例外に対処する(その場で対処する)」場合、「tryブロック」と「catchブロック」を利用して行います。
ここでの「その場で対処する」という言葉は、例外が発生するクラスの中で直接、例外を処理することを意味します。
例外処理のコードを記述する際には、tryブロックとcatchブロックを組み合わせて使用します。
try
tryブロックの役割を説明していきます。
基本的に、プログラムの中で例外が発生すると、その時点でプログラムが異常終了します。
例外が発生する可能性のあるコードをtryブロックで囲むことで、例外が発生した際にすぐに異常終了させずに、catchブロックへと処理を引き継ぐようになります。
構文
try{ 例外が発生する可能性があるコード }
(例)
try{ //ここに例外が起こる可能性がある処理を書く int a = 10 / 0 ; //↑の処理は、「数字を0で割る」ことが原因で「ArithmeticException」という例外が発生します。 } int b = 10 / 0; //↑tryブロックの外に書いたコードで例外が起こった場合には、catchブロックに処理が引き継がれず、プログラムが異常終了してしまいます。
catch
catchブロックは、tryブロックの中で例外が発生したときに、プログラムを終了させることなく、何らかの処理を行わせることができるブロックです。
ここに処理を記述することによって、異常終了させることなく、起こった例外エラーログを残したり、別の処理をさせることができます。
catchブロックは、必ずtryブロックに続けて定義し、どんな例外を対象にするかを記述する必要があります。
構文
catch(例外クラス 変数名){ 例外が起こった際に行う処理 }
(例)
try{ int a = 10 / 0 ; //↑「ArithmeticException」という例外が発生します。 }catch(ArithmeticException e){ //今回の場合は、「ArithmeticException」という例外が起こるので、その例外クラスを指定しています。 e.printStackTrace(); /* 例外クラスの変数「e」に対して「printStackTrace()」というメソッドを呼び出しています。 このメソッドは、起こった例外の詳しい情報をコンソールに表示してくれるメソッドです。 */ }
catchブロックを記述する際に気を付けなければいけないことは、指定する例外クラスです。
ここではcatchブロックのクラスの部分に「ArithmeticException」という例外クラスを指定しています。
この場合、tryブロックの中で「ArithmeticException」という指定した例外クラスか、「ArithmeticException」クラスのサブクラスとして定義された例外が発生した時に、このcatchブロックに処理が引き継がれるということになります。
すなわち、ここで指定しなかった別の例外が発生した場合、このcatchブロックでは処理しきれないということです。
この問題を解決するためには、「広い範囲の例外をキャッチできる例外クラスを指定する」か「catchブロックを複数定義する」かのどちらかの方法で対処するしかありません。
これらの方法については、別の記事で詳しく解説します。
finally
tryブロックとcatchブロックを組み合わせて利用することで、例外が起こった時の処理を記述することができました。
例外処理を交えたプログラムを書いていくと、「例外が発生しても、しなくても必ず行いたい処理」が出てくることがあります。
特に外部ファイルなどに接続するときに、「接続を切断する」という処理を書く必要があり、これは例外が起こって強制終了する場合でも行う必要があります。
そのような場合、tryブロックとcatchブロックの両方に同じ記述をすればいいのですが、プログラムも長くなってしまい、冗長になってしまいます。
そこで利用する記述が「finallyブロック」です。
「finallyブロック」はcatchブロックかtryブロックの後に続けて記述し、「例外が発生しても、しなくても必ず実行する処理」を担います。
try{ 例外が発生する可能性があるコード } catch(例外クラス 変数名){ 例外が起こった際に行う処理 }finally{ 例外が起こっても、起こらなくても実行したい処理 }
(例)
try{ int a = 10 / 0 ; //↑「ArithmeticException」という例外が発生します。 }catch(ArithmeticException e){ //今回の場合は、「ArithmeticException」という例外が起こるので、その例外クラスを指定しています。 e.printStackTrace(); }finally{ System.out.println("プログラムを終了します。"); //↑の処理は例外が起こっても起こらなくても必ず実行されます。 }
例外処理編・次回の内容
今回は例外処理の概要と種類を紹介しました。
次回は、例外処理を行う際に、複数のcatchブロックを利用する方法を解説していきます。
初めてのJavaシリーズの目次はこちら
例外処理編の記事一覧はこちら