Java 例外処理のサンプル(非検査例外)

Javaの例外処理の非検査例外のサンプルです。

目次

説明 例外処理で使用するtry...catch構文
  非検査例外とは
サンプル 非検査例外のサンプル
  呼び出し元に例外を投げ続けるサンプル(例外の伝播)

例外処理で使用するtry...catch構文

try {
   実行する処理
catch ( 例外のクラス 変数 ) {
   実行する処理
finally{
 実行する処理
}
  • 例外が起こる可能性がある箇所をtryブロックで囲みます。
  • 例外が発生しcatchブロックの引数の例外のクラスの型と同じときにcatchブロックの処理が行われます。
  • catchの引数の変数は、例外のクラスのインスタンスになります。
  • catchは複数記述できます。
  • finallyブロックは例外のあるなしにかかわらず常に実行されます。

非検査例外とは

テキストファイルの読み込みやSQLでデータを取得するなどは、エラーが発生することを想定すべき例外で検査例外と呼ばれます。非検査例外はそれ以外の例外のことです。

クラスでいうとRuntimeExceptionクラスとその配下の例外クラスのことです。
変数がnullの場合に発生するNullPointerException等があります。

  • 例外処理の記述(try-catch)がなくてもコンパイルエラーになりません。
  • try-catchがない状態で非検査例外が発生した場合、例外は呼び出し元に投げられます。
  • 例外が拾われずに呼び出し元に投げられ続け、mainで終わった場合は落ちます。
  • 例外が処理されず呼び出し元に投げられることを例外の伝播といいます。
  • 非チェック例外 (unchecked exception)とも呼ばれます。
  • Errorクラスの配下の例外では、OutOfMemoryError等があります。回復不能のエラーと言われます。try-catchは必須では有りません。
  • Exceptionクラスとそのクラス配下の例外では、FileNotFoundException等があります。try-catchが必須です。検査例外と呼ばれます。

以下は、主な非検査例外のクラスです。

クラス名(例外名) 説明
NullPointerException nullポインタへのアクセス
ArrayIndexOutOfBoundsException 配列の添字の不正
IllegalArgumentException 引数の値のエラー
ArithmeticException 0による除算

以下はJava8 API仕様のRuntimeExceptionクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/RuntimeException.html

非検査例外のサンプル

非検査例外のサンプルコードです。

package test1;

public class Test1 {
	public static void main(String[] args) {
		try {
			// メソッドを呼ぶ側
			Sample.runSample();
		// 例外をキャッチ
		} catch (ArithmeticException e) {
			System.out.println(e); 
			//java.lang.ArithmeticException: / by zero
		}finally {
			System.out.println("finallyの実行"); 
		}
	}
}
class Sample {
	// メソッドが呼ばれる側
	static void runSample() {
		// 0による除算のためArithmeticExceptionの例外が発生
		int i = 0;
		i = 10 / 0; 
	}
}

5行目からtry-catchを記述しています。
22行目で0による除算のため非検査例外(ArithmeticException)が発生します。
9行目で例外をキャッチしています。
eはArithmeticExceptionクラスのインスタンスです。

呼び出し元に例外を投げ続けるサンプル(例外の伝播)

try-catchがないため、呼び出し元に例外が投げ続けられるサンプルです。

package test1;

public class Test1 {
	public static void main(String[] args) {
		Test2 t2 = new Test2();
		try{
			// メソッドの呼び出し元1
			t2.runSample1();
		} catch (ArithmeticException e) {
			System.out.println(e);
			//java.lang.ArithmeticException: / by zero
		}
 	}
}
class Test2 {
	void runSample1(){
		// メソッドの呼び出し元2
		Test3.runSample2();
		// try-catchがないので例外はさらに呼び出し元に投げられる
	}
}
class Test3 {
	static void runSample2() {
		// try-catchがないため呼び出し元に例外が投げられる
		int i;
		i = 10/0;
	}
}

8行目は、16行目のメソッドを呼び出しています。
18行目は、23行目のメソッドを呼び出しています。
26行目で0による除算のため非検査例外(ArithmeticException)が発生します。
try-catchがないため呼び出し元の18行目に例外が投げられます。
18行目でもtry-catchがないため呼び出し元の8行目に例外が投げられます。
9行目で例外がキャッチされます。

関連の記事

Java 例外処理のサンプル(検査例外)
Java throw 例外処理をスローするサンプル
Java 独自の例外を作成するサンプル

△上に戻る