1. 例外とは
- 例外には大きくチェック例外(発生時の対処の記述が必須な例外)を非チェック例外(実行時例外、発生時の対処の記述が必須でない)に分けられる
- チェック例外は対処するコードを書かないとコンパイルエラーになる
- 非チェック例外は対処するコードを書くかどうかは自由
2. try-catch-finaly文
try {
//通常の処理
} catch(例外クラス名 引数) {
//例外への対処
} finally {
//例外発生の有無にかかわらず最後に必ず実行される処理
}
- 例外の対処には、例外が発生しそうなコードをtry-catchブロックで囲む
- catch文には、発生すると予測される例外の型に応じた引数を書く
- 例外とそれに対応するクラス型を知っておく必要がある
- 例外が発生すると直ちに該当のcatch文に制御が移る
- catch文に制御が移ると残りの処理は実行されない
- finallyブロックに書いた処理は全ての処理の後に必ず実行される
3. 例外クラス
クラス | 意味 | 概要 |
---|---|---|
RuntimeException | 実行時例外 | プログラムミスに起因するエラー状態 |
ClassCastException | キャストの失敗 | オブジェクトの型に注目。スーパークラス=>サブクラスでオブジェクトの実体がスーパークラスあるいは継承関係にないクラスであるときにおきる |
IllegalArgumentException | 不正な引数 | 不正な引数、不適切な引数をメソッドに渡した時に発生する |
NumberFormatException | 数値型文字列の書き誤り | 文字列を数値型に変換しようとした時、文字列の形式が正しくなかったという例外。数値に直せない文字列が原因で発生する |
IllegalStateException | 不正な状態での呼び出し | 不適切なジョウタでメソッドを呼び出したときの例外 |
IndexOutOfBoundsException | 不正な状態での呼び出し | 配列や文字列の操作で範囲を超えてアクセスした |
ArrayIndexOutOfBoundsException | 配列の要素番号が範囲外 | 配列や文字列の操作で範囲を越えてアクセスした |
NullPointerException | 使ったオブジェクトがnull | nullを使って配列やクラスオブジェクトを参照しようとした |
ArithmeticException | 算術エラー | 算術計算で例えばゼロでintの値を割るなどのエラー |
4. 例外を捕捉する(throwsキーワード)
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Exec {
public static void main(String[] args){
try{
readFile();
} catch(FileNotFoundException e){
System.err.println("File is not found"); //標準エラー出力 System.err.println
} catch(IOException e){
System.err.println("File is not reading");
}
}
public static void readFile() throws IOException {
FileReader in = new FileReader("note.txt"); //ファイルを開く
int c = in.read(); //ファイルから1文字読む
System.out.println((char)c); //文字にキャストして表示
in.close(); //ファイルを閉じる
}
}
- チェック例外はtry-catchで例外処理をしなければならない
- 例外処理をしない場合はthrowsを宣言しなければならない
5. 例外を投げる
throw文を使い、強制的に例外を発生させる
5-1. チェック例外(IOException)を投げる
public static void methodA() throws IOException {
if(a == null){
throw new IOException();
}
}
5-2. 非チェック例外(実行時例外)を投げる
public static void methodB() {
if(a == null)
throw new NullPointerException();
}
}
5-3. 例外クラスのメソッド
printStackTrace
例外の名前、例外の発生場所、例外を発生したメソッドに至るメソッド感の連鎖関係
toString()
printStackTraceの1行目に当たる文字列
getMessage()
エラーメッセージ
6. 独自の例外クラスの作成
既存の例外クラスを継承した例外クラスを作成し、それをthrow文で投げることも出来る。継承できるのはThrowableクラスの継承ツリーにあるクラスのみ。既存の例外クラスを継承しないクラスを独自の例外クラスとして使うことは出来ない。
7. オーバロード・オーバライドにおける例外の条件
7-1. オーバロード
- 新しい例外や範囲の広い例外を宣言することが出来る
7-2. オーバライド
- スーパークラスのメソッドがどんな例外を宣言していても、新たに非チェック例外(実行時例外)を投げることが出来る
- 新しいチェック例外を投げることは出来ない
- スーパークラスでの宣言よりも範囲の広いチェック例外を投げてはならない
- スーパークラスでの宣言よりも範囲の狭いチェック例外を投げても良い
- スーパークラスでどんな例外を投げていても、例外を投げないようにして良い