Javaの例外処理の非検査例外のサンプルです。
目次
サンプル | 例外処理で使用するtry...catch構文 |
非検査例外 | |
非検査例外のサンプル | |
呼び出し元に例外を投げ続けるサンプル(例外の伝播) | |
非検査例外+throws句あり | |
finally句で例外は発生する? |
例外処理で使用するtry...catch構文
try { 例外が発生する可能性がある処理 } catch ( 例外のクラス 変数 ) { 例外発生時の処理 } finally{ 例外ありなしに関わらず実行する処理 } |
- 例外が起こる可能性がある箇所をtryブロックで囲みます。
- 例外が発生しcatchブロックの引数の例外のクラスの型と同じときにcatchブロックの処理が行われます。
- catchの引数の変数は、例外のクラスのインスタンスになります。
- catchは複数記述できます。
- finallyブロックは例外のあるなしにかかわらず常に実行されます。
非検査例外
非検査例外の対象は、RuntimeExceptionクラスとその配下の例外クラスです。
例外処理のtry-catchの記述がなくてもコンパイルエラーになりません。実行時に発生する例外です。
nullポインタへのアクセス(NullPointerException)や配列の添字の不正(ArrayIndexOutOfBoundsException)や0による除算(ArithmeticException)や引数の値のエラー(IllegalArgumentException)等の例外です。
- try-catchがない状態で非検査例外が発生した場合、例外は呼び出し元に投げられます。
- 例外が拾われずに呼び出し元に投げられ続け、mainで終わった場合は落ちます。
- 例外が処理されず呼び出し元に投げられることを例外の伝播といいます。
- 非チェック例外 (unchecked exception)とも呼ばれます。
- Exceptionクラスとその配下のクラスの例外の原因はプログラムによるものです。
- 例外が発生すると例外のクラスからオブジェクトが生成されます。
以下はJava8 API仕様のRuntimeExceptionクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/RuntimeException.html
Errorクラス
- Errorクラスとその配下のクラスの例外の原因はシステムによるもので、回復不能のエラーと言われます。try-catchは必須では有りません。OutOfMemoryError等があります。
非検査例外のサンプル
非検査例外のサンプルコードです。
package com.example.demo;
public class Test1 {
public static void main(String[] args) {
try {
int num = calcNumber(); // メソッドを呼ぶ側
} catch (ArithmeticException e) {
System.out.println(e);
// java.lang.ArithmeticException: / by zero
} finally {
System.out.println("finally"); //finally
}
}
// メソッドが呼ばれる側
static int calcNumber() {
// 0による除算のためArithmeticExceptionの例外が発生
return 10 / 0;
}
}
5行目からtry-catchを記述しています。
18行目で0による除算のため非検査例外(ArithmeticException)が発生します。
8行目で例外をキャッチしています。
eはArithmeticExceptionクラスのインスタンスです。
呼び出し元に例外を投げ続けるサンプル(例外の伝播)
try-catchがないため、呼び出し元に例外が投げ続けられるサンプルです。
package com.example.demo;
public class Test1 {
public static void main(String[] args) {
try {
calcNumber1(); // メソッドを呼ぶ側
} catch (ArithmeticException e) {
System.out.println(e);
// java.lang.ArithmeticException: / by zero
}
}
static void calcNumber1() {
calcNumber2(); // メソッドを呼ぶ側2
// try-catchがないので例外はさらに呼び出し元に投げられる
}
static void calcNumber2() {
// 例外発生もtry-catchがないため呼び出し元に例外が投げられる
int i = 10 / 0;
}
}
6行目からメソッドを呼び出し、20行目で例外が発生します。
その場合try-catchがないため14行目に戻りさらに6行目まで戻って
7行目で例外がcatchされます。
非検査例外+throws句あり
throws句をつけたパターンです。throws句はない場合でもエラーにならず、try-catchも機能します。
package test1;
public class Test1 {
public static void main(String[] args) {
try {
calcNumber1(); // メソッドを呼ぶ側
} catch (ArithmeticException e) {
System.out.println(e);
// java.lang.ArithmeticException: / by zero
}
}
static void calcNumber1() throws ArithmeticException {
int i = 10 / 0;
}
}
finally句で例外は発生する?
finally句でも例外は発生します。
package com.example.demo;
public class Test1 {
public static void main(String[] args) {
String str = null;
try {
System.out.println("test"); // test
} catch (ArithmeticException e) {
System.out.println(e);
} finally {
try {
System.out.println(str.substring(1, 2));//NullPointerException
} catch (Exception e) {
System.out.println(e);
}
}
}
}
14行目は、文字の切り出しを行いますが値がnullのため例外が発生します。
finally句の中にtry-catchの記述もできます。
関連の記事
Java 例外処理のサンプル(検査例外)
Java throw 作成した例外を投げる/例外を更に投げる
Java 独自の例外を作成するサンプル