トップ 言語 Java 例外処理、メモリ管理、主なコマンド Javaの例外処理

Javaの例外処理―try/catchによる処理継続、finallyブロック、例外クラスの種別など

try/catchによる処理継続、finallyブロック、例外クラスの種別など。Javaの例外処理についてまとめています。

Javaの例外と例外処理

プログラムはコンパイルが成功しても、実行した際にエラーが発生することがあります。 Javaでは、プログラム実行時に発生したエラーを例外と呼びます。

例外は発生箇所(一番下はJVM)から呼出元へと通知されていく仕組みになっていて、例外が投げられてくるイメージになります。 このようなイメージの例外ですが、Javaでは、例外が発生することを「例外がスローされる」といいます。

Javaには、例外がスローされた後に例外を感知する仕組みがあります。 これをキャッチするといいます。

継続的に実行し続けないといけないアプリケーションの場合、実行時に起こり得るエラーによって異常終了しないようにエラー予防をしておく必要があります。 例外処理を実装する必要があります。 Javaには、try/catch文という例外をキャッチする仕組みがあり、これを活用して例外処理を実装していきます。

Javaの例外処理の基本(try/catch文による処理継続)

Javaでは例外(Exception)が発生したときにプログラムがどう振舞うかを記述することで、万一例外が発生してもプログラムの実行が継続できるように出来ます。

try/catch文を使用すると、実行時エラーに対応したプログラムを作成できます。 この処理を「例外処理」と呼びます。

例外処理の基本形は以下のようになります。

try {
    例外が発生する可能性のある処理;

} catch(例外のクラス 変数名) {
    例外に対する処理;
}

例外処理は、まずtryで、例外が発生する可能性のある処理を行い、例外が発生した場合はcatchで細くし、種類に応じた処理を実行します。

なお、catchは、どのような例外に対応するのかを示す例外のパラメータを必要とします。

例外が対処されていない例

たとえば、次のコードのように配列の要素数を超えて値の代入を行うと構文のエラーは表示されませんが、いざ実行してみると次のようにエラー(例外)が発生します。

例外が発生するコード

public class Sample {
	public static void main(String[] args) {
		int numArry[] = new int[2];
		numArry[4] = 10;
		System.out.println("配列の5番目の値は" + numArry[4] + "です。");
	}
}

例外が発生した様子

javac Sample.java
java Sample
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
        at Sample.main(Sample.java:4)

try/catch文の例

そこで、以下のように、例外が発生する可能性のある処理をtryで囲み、発生した例外をパラメータとしてcatchを記述します。

ArrayIndexOutOfBoundsException例外をtry/catchで対処したコード

public class Sample {
	public static void main(String[] args) {
		int numArry[] = new int[2];

		try {
			numArry[4] = 10;
			System.out.println("配列の5番目の値は" + numArry[4] + "です。");

		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("配列の要素に値が代入できません。");
		}
	}
}

例外処理を加えたコードとその実行結果

javac Sample.java
java Sample
配列の要素に値が代入できません。

このように、今度は実行すると「配列に値を代入できません。」と表示されます。

以上のように、例外処理を行えば、プログラムが強制終了することはありません。 実行時エラーが発生しても、適切なエラーメッセージを表示して、最後まで無事に実行されるプログラムとなります。

finallyブロック

上記では、tryとcatch文について見て行きました。 tryブロックは例外が発生しそうなところに、catchブロックは例外が発生したときの処理を定義しました。

ただ、例外が発生しても発生しなくても必ず実行したい処理もあります。 例えば、ファイルやDBにアクセスしていた場合の最後のファイルやDBとのコネクションを閉じる処理があげられます。 このように例外の発生有無にかかわらず必ず実行したい処理はfinallyブロックに定義できます。

try {
    例外が発生しそうな処理;
} catch (キャッチする例外クラス) {
    例外発生時の処理;
} finally {
    例外が発生してもしなくても行いたい処理;
}

なお、Java7からはtry-with-resource文が登場して、Closeableインタフェースを実装しているクラスなら、リソースの解放処理などfinallyブロックを記述しなくても終了処理が自動で実行できるようになりました。

try (リソース;) {
    例外が発生しそうな処理;
} catch (キャッチする例外クラス) {
    例外発生時の処理;
}

例外クラスの種類

Javaの例外クラスは、unchecked例外とchecked例外があります。

もっと知識を広げるための参考

戻る

スポンサーリンク

サイト内のページ

言語
C・C++ /HTML /Java /JavaScript /PHP /シェルスクリプト

開発環境
Ant /Bcc /Eclipse /gcc /gdb /g++ /JDK /JUnit /ZAP

技術・仕様
Ajax /CORBA /Java EE(旧称J2EE) /JNI

ライブラリ/Framework/CMS
jQuery /Lucene /MyBatis /RESTEasy /Spring /Struts /Seasar2 /WordPress

ITインフラ OSとミドルウェア
Linux /Windows /シェル
Apache/Tomcat /MySQL /Redis /Solr /vsftpd

ITインフラ PC 製品
ZOTAC

ITインフラ サーバー
Web公開サーバー構築

ITインフラ ネットワーク
プログラミング /機器 /構築

ITインフラ セキュリティ
公開サーバーのセキュリティ

SI
ホームページの作り方 /小さな会社のISMS

その他
IT用語 /ITスキル体系 /トレンド履歴

スポンサーリンク