【Java】例外処理とは?【書き方や使い道も解説】

例外処理_アイキャッチ画像 Java

「そもそも例外処理って何?」

「どうやって書けばいいの?」

「例外処理する必要ある?」

という方に向けて、例外処理とは何か、例外処理の使い方について解説していきます。

例外処理とは?

例外処理とは、プログラムの実行中にエラー(例外)が起きた時、行う処理のことです。

ここで、プログラムの実行中というのがポイントです。

ソースコードの文法に間違いがある場合などは、コンパイル時にエラーが出ます。

下の画像では3行目の配列の定義の仕方が間違っているため、エラーが出ています。


しかし、以下のような例ではどうでしょう?

文法的な間違いはないので、エラーは出ていません。

しかし、実行してみるとエラーが発生します。

これは、5行目で存在しない配列の要素番号を参照しようとしているからです。

このように、実行中に発生するエラーに対処するため、例外処理を使います。

例外処理もオブジェクト!?

例外処理では、エラーが発生した時に、そのエラーの情報を持ったオブジェクトを生成します。

エラーの情報を持ったオブジェクトのことを例外オブジェクトと言います。

また、例外オブジェクトを作るためのクラスを例外クラスと言います。

例外クラスは、エラーの種類ごとに存在しており、たくさんの種類があります。

具体的には以下のようなものです。

・IOExceptionクラス:入出力でエラーが発生した時

・SQLExceptionクラス:データベースへのアクセス時にエラーが発生した時

・ArithmeticExceptionクラス:不正な計算(0で割る)が行われた時

このように、様々なエラーに対応する例外クラスがあるのです。

ここでは、エラーもオブジェクトであり、そのオブジェクトを作るクラスがあるということを覚えていってください。

例外処理の書き方

例外処理を書く時には以下の2通りの方法があります。

・try-catchによる例外処理

・throwsキーワードによる例外処理

try-catchによる例外処理

try-catchの書き方は以下の通りです。

try{

    //エラーが発生しそうな処理

}catch(/* 例外オブジェクトを受け取る引数 */){

    //エラーが起きた時の処理

}finally{

    //エラーの発生に関わらず実行される処理

}

try、catch、finallyそれぞれのブロックに分けて、説明します。

tryブロック

tryブロックには、エラーが発生しそうな処理を書きます。

普通のプログラムと同じように、上から順に実行されます。

エラーが起きなかった場合は、catchブロックには入らず、finallyブロックの処理を実行して終了します。
(finallyブロックがない場合には、そのまま終了します。)

エラーが起きた場合、それ以降の処理は実行せずに、catchブロックへ飛びます。

catchブロック

catchブロックには、エラーが起きた時に行う処理を書きます。

tryブロックでエラーが起きた時だけ処理されます。

catchの後ろの()内には、対処したいエラーの例外オブジェクトを受け取る引数を定義します。

例えば、データベースへのアクセス時のエラーが発生する可能性がある時には、前の章で紹介した、SQLExceptionクラスのオブジェクトを引数として用意します。

全ての例外クラスは「Exception」という例外クラスを継承しているため、とりあえずExceptionクラスのオブジェクトを引数にしておけば動きます。

finallyブロック

finallyブロックには、必ず実行させたい処理を書きます。

finallyブロックの処理は、tryブロックでエラーが発生してもしなくても必ず実行されます。

また、省略することもできます


サンプルコードを以下に書いておくので、参考にしてください。

public class Test {
	public static void main(String[] args) {
		int[] number = {1, 2, 3};

		try{
			System.out.println(number[0]); //1が表示される
			System.out.println(number[4]); //要素番号4は存在しないのでエラーが発生し、catchブロックへ
			System.out.println(number[2]); //上の行でエラーが発生したので実行されない

		}catch(ArrayIndexOutOfBoundsException e) { //配列の範囲外にアクセスした時の例外クラス
			System.out.println("不正な添字だよ"); //エラー時に実行される
		}finally {
			System.out.println("実行終了"); //必ず実行される
		}
	}
}

実行結果

throwsキーワードによる例外処理

throwsキーワードは、主にメソッドに関する例外処理をする時に使います。

throwsキーワードを記述することで、例外処理を発生元に任せることができます。

書き方は以下の通りです。

メソッド宣言( ) throws 例外クラス{ }

実際に例を見てみましょう。

public class Test {
	public static void main(String args[]) {
		int a = 18;
		int b = 6;

		try {
			int c = divide(a, b);
			System.out.println(c);
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

    //割り算を行うメソッド
	public static int divide(int num1, int num2) throws Exception{
		return num1 / num2;
	}
}

この例では、割り算を行うdivideメソッドを定義し、それをmainで使っています。

15行目に注目してください。

メソッドの宣言時に「throws Exception」というワードが書かれています。

これを追記することで、divideメソッド内では例外処理を行わずに、呼び出された場所に例外処理を任せることができるのです。

つまり、この例では、divideメソッドを呼び出しているmainの中で例外処理をしなければいけません。(mainで例外処理をしないとエラーになります。)

例外処理をする理由

例外処理をする理由は主に2つです。

・エラー箇所と原因を突き止める

・データに一貫性を持たせる

エラー箇所と原因を突き止める

これは、先ほどご紹介したようなprintStacTrace( )メソッドを用いることで、エラー箇所や、何が原因でエラーが起きたのか表示させることができます。

エラーが起きそうな箇所には例外処理をして、printStacTrace( )メソッドを使うといいでしょう。

データに一貫性を持たせる

例外処理は、主にデータベースを用いた処理をするときに、よく使用します。

これは、データベース上のデータに一貫性を持たせるためです。

例えば、銀行の振り込みのシステムを考えてみてください。

Aさんが、Bさんへ100万円振り込むとします。

プログラムの処理手順は以下のようになります。

  1. Aさんの口座から100万円マイナスする
  2. Bさんの口座に100万円プラスする

しかし、Bさんの口座に100万円プラスする時に、なんらかのエラーが起き、Bさんの口座に100万円プラスできなかったとしましょう。

すると、Bさんの口座に100万振り込まれていないにも関わらず、Aさんの口座からは100万円が引き落とされている状態になってしまいます。

このようなことを回避するために、エラーが起きた時には「プログラムを実行する前の状態に戻す」という例外処理をしておくのです。

try{
    //Aさんの口座から指定額をマイナスする処理
     ・・・・

    //Bさんの口座に指定額をプラスする処理
      ・・・・

}catch(Exception e){
    //実行する前の状態に戻す処理
      ・・・・
}

まとめ

例外処理とは?
 プログラムの実行中に発生するエラーに対処するための処理

例外処理のオブジェクト、クラス
 ・エラーの情報を持っているのは例外オブジェクト
 ・例外オブジェクトを作るための例外クラス(エラーの種類ごとに存在する)

例外処理の書き方
 ・try-catchによる例外処理
 ・throwsキーワードによる例外処理

例外処理をする理由
 ・エラーの発生箇所、原因を突き止めるため
 ・データに一貫性を持たせるため

コメント

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