例外


例外の種類

例外の種類

エラーの種類は大きく以下の3つ。
1.文法エラー
2.実行時エラー
3.論理エラー

1.文法エラー

・文法の誤りによるコンパイルミス
・例はセミコロン忘れ、スペルミスなど
・コンパイルされない

2.実行時エラー

・実行中に不具合が発生することで発生するエラー
・例はあるはずのファイルが削除される、あるはずの値がnull値になっているなど
・コンパイルされる

3.論理エラー

・構文ミスにより、実行結果が意図していたものと異なること
・例は電卓ソフトで3+5が35と出力されるなど
・コンパイルされる

まとめると・・・

3種類あるが
「2.実行時エラー」に対しては、エラー発生時を想定したコードを記述して対応!
「1.文法エラー」・「3.論理エラー」は、元々のコードを修正して対応!

例外を表すクラスとその種類

・エラー発生状況毎にクラスが用意されており、継承階層で構成されている
・クラス毎の意味・継承階層図は以下の通り

まとめると・・・

Exceptionに対しては、エラー発生時に対応出来るようなコードを記述する必要がある

例外の処理

例外の調べ方

例外はJavaAPIに記載されている

例外処理の種類

例外処理の種類は大きく以下の2つ。
1.catch構文
2.throws構文

1.catch構文

catch構文とは

例外が発生した場合の処理を、自身のメソッド内に記述する際に使用する

使用方法

try {
  本来の処理
}catch (例外クラス 変数名) {
  例外が発生した場合の処理
}finally{
  例外があってもなうても必ず実行する処理
}

[処理の流れ]
tryメソッド内に処理を記述し、例外が発生した場合は、エラークラスのインスタンスをcatchに渡す
catch(例外クラス 変数名)(例外クラス 変数名)で例外インスタンスを受け取る。
 メソッド内には受け取った後の処理を記述する。
finallyでは、ファイルを閉じる・切断などの処理を実施する。

例外インスタンスが持つ情報

①例外情報の解説文

いわゆる、エラーメッセージ。String getMessage()で表示。

②スタックトレース

JVMがプログラムのメソッドをどのような順序で呼び出し、どこで例外が発生したか。
void printStackTraceで内容表示。

    public static void main (String[] args) {
        FileWriter fw = null;
        try {
            fw = new FileWriter("date.txt");//インスタンスの生成
            fw.write("hellow");//中にhellowと書き込む
        }catch (Exception e) {
            System.out.println("何らかの例外が発生しました");
        }finally{
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

補足

catch (Exception e)Exceptionの子孫の、例外インスタンスなら全て受け取るという意味
・FileWriterクラスについては以下参照
 https://docs.oracle.com/javase/jp/6/api/java/io/FileWriter.html
 https://www.sejuku.net/blog/20657

finalyを省略した書き方

try (
  ファイルインスタンスの生成
){
  ファイルに対する処理
}catch{
}

()内で開かれた、ファイルやデータベースは、処理終了後に自動でcloseメソッドを呼び出してくれる。

2.throws構文

throws構文とは

例外が発生した場合の処理を、呼び出し元のメソッドにお願いする際に記述する方法

使用方法

メソッド名  throws 例外クラス名1,例外クラス名2 

[補足]
throwsを宣言する事で、try catch文の記述が義務では無くなる
・呼び出し元メソッドは、try catch文を記述する必要がある

例外を発生させる方法

考え方

発生した例外を受け取るだけでなく、例外を通知する事が可能

使用方法

throw 例外インスタンス名

//mainメソッド
public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(-100);

    }
}
//Personクラス
public class Person {
    int age;
    public void setAge(int age) {
        if(age<0) {
            throw new IllegalArgumentException("年齢は正の数を指定すべきです。");
        }
        this.age = age;
    }


}
//出力結果
Exception in thread "main" java.lang.IllegalArgumentException: 年齢は正の数を指定すべきです
    at Java15.Person.setAge(Person.java:7)
    at Java15.Main.main(Main.java:6)

・IllegalArgumentExceptionクラスについては以下参照
https://docs.oracle.com/javase/jp/7/api/