Javaの非検査例外のサンプルです。
目次
サンプル | 非検査例外とは |
例外処理で使用するtry...catch構文 | |
非検査例外のサンプル | |
呼び出し元に例外を投げ続けるサンプル(例外の伝播) | |
finally句で例外は発生する? |
非検査例外とは
nullポインタへのアクセスや配列の添字の不正や0による除算等の例外です。
クラスでいうとRuntimeExceptionクラスとその配下の例外クラスのことです。
- 例外処理の記述(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
例外処理で使用するtry...catch構文
try { 実行する処理 } catch ( 例外のクラス 変数 ) { 実行する処理 } finally{ 実行する処理 } |
- 例外が起こる可能性がある箇所をtryブロックで囲みます。
- 例外が発生しcatchブロックの引数の例外のクラスの型と同じときにcatchブロックの処理が行われます。
- catchの引数の変数は、例外のクラスのインスタンスになります。
- catchは複数記述できます。
- finallyブロックは例外のあるなしにかかわらず常に実行されます。
非検査例外のサンプル
非検査例外のサンプルコードです。
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されます。
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 独自の例外を作成するサンプル