Javaの例外処理の検査例外のサンプルです。
目次
サンプル | 例外処理で使用するtry...catch構文 |
検査例外とは | |
検査例外+throws句あり | |
検査例外+throws句なし |
例外処理で使用するtry...catch構文
try { 例外が発生する可能性がある処理 } catch ( 例外のクラス 変数 ) { 例外発生時の処理 } finally{ 例外ありなしに関わらず実行する処理 } |
- 例外が起こる可能性がある箇所をtryブロックで囲みます。
- 例外が発生しcatchブロックの引数の例外のクラスの型と同じときにcatchブロックの処理が行われます。
- catchの引数の変数は、例外のクラスのインスタンスになります。
- catchは複数の記述できます。
- finallyブロックは例外のあるなしにかかわらず常に実行されます。
検査例外とは
検査例外とは例外の種類で、対象はExceptionクラスとそのサブクラスでRuntimeExceptionクラスとそのサブクラスではないものです。
コンパイル時に例外処理のtry-catchがない場合はエラーになり、例外処理を行う必要性が明示的になります。
ファイルの読み込み時にファイルがない(FileNotFoundException)やSQLでエラーが発生した(SQLException)や入出力エラー(IOException)等の例外です。
- メソッドを呼ぶ側でtry-catchを行う場合、メソッドが呼ばれる側にthrows句の記述が必要です。
→ただしメソッドが呼ばれる側でtry-catchを行う場合は、throws句の記述は不要です。 - チェック例外(checked exception)とも呼ばれます。
- Exceptionクラスとその配下のクラスの例外の原因はプログラムによるものです。
- 例外が発生すると例外のクラスからオブジェクトが生成されます。
以下はJava8 API仕様のExceptionクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Exception.html
Errorクラス
- Errorクラスとその配下のクラスの例外の原因はシステムによるもので、回復不能のエラーと言われます。try-catchは必須では有りません。OutOfMemoryError等があります。
検査例外+throws句あり
メソッド throws 例外クラス |
検査例外でthorws句があるサンプルです。
メソッドを呼ぶ側でtry-catchを行う場合、メソッドが呼ばれる側にthrows句の記述が必要です。
package test1;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
try {
// メソッドを呼ぶ側
FileTest.read();
} catch (IOException e) { // 例外をキャッチ
System.out.println(e);
//java.nio.file.NoSuchFileException: D:\workspace\test2.txt
}finally {
System.out.println("finallyの実行");
}
}
}
class FileTest {
// メソッドが呼ばれる側
static void read() throws IOException {//throws IOExceptionを書く
String dir = "D:\\workspace";
String filename = "test2.txt";
// 存在しないファイルを読みに行って例外(IOException)が発生
List<String> line = Files.readAllLines(Paths.get(dir, filename),
Charset.forName("SHIFT_JIS"));
}
}
12行目でFileTestクラスのreadメソッドを呼んでいます。
23行目にthrows句(throws IOException)を記述しています。
27行目で存在しないファイルを読みに行って検査例外(IOException)を発生させています。
13行目で検査例外(IOException)をキャッチしています。
eはIOExceptionクラスのインスタンスです。
検査例外+throws句なし
検査例外でthorws句がないサンプルです。
メソッドが呼ばれる側でtry-catchを行う場合は、throws句の記述は不要です。
package test1;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
// メソッドを呼ぶ側
FileTest.read();
}
}
class FileTest {
// メソッドが呼ばれる側
static void read() {
String dir = "D:\\workspace";
String filename = "test2.txt";
// 存在しないファイルを読みに行って例外(IOException)が発生
try {
List<String> line = Files.readAllLines(Paths.get(dir, filename),
Charset.forName("SHIFT_JIS"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
11行目でFileTestクラスのreadメソッドを呼んでいます。
21行目で存在しないファイルを読みに行って検査例外(IOException)を発生させています。
23行目で検査例外(IOException)をキャッチしています。eはIOExceptionクラスのインスタンスです。
16行目にはthrows句(throws IOException)はありません。
関連の記事
Java 例外処理のサンプル(非検査例外)
Java throw 作成した例外を投げる/例外を更に投げる
Java 独自の例外を作成するサンプル