【Java】Javaの例外処理の特徴や制約についてまとめてみました!

javaには例外処理という、例外が発生した時にどうするのかを事前に処理として定義することができます。


今回は、例外処理を覚える上で重要なところをまとめてみます。

例外クラスとは?

f:id:koko55120:20220117170608j:plain
例外クラスは、Javaの例外となる処理を実施するためのクラスです。


例外クラスの親は全て「thorwable」クラスで、全ての例外クラスはthorwableクラスから継承されています。


他にも例外の種類によって2種類のクラスに分かれています。

・メモリ不足などのエラーに関するクラスはErrorクラス
・アプリケーションで発生するエラーに関するクラスはException


例外クラスの中にも制約があって、 例外が発生した際に例外に対する処理を必ず実施しなければならないクラス任意のクラスがあります。
以下に制約をまとめました!

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/7/1 17:57時点)
感想(6件)


・Exceptionクラスを継承したRuntaimeExceptionクラスおよびそのサブクラスは例外処理は任意
・ExceptionクラスおよびRuntaimeException以外のサブクラスの場合は例外処理は必ず記載する

try-chtch-finaly句について

例外処理を定義するには、try-chtch-finaly句を記入するのですが、これらには組み合わせによってルールがあるので注意してください。

■Try文の組み合わせルール

①try-catch-finalyの組み合わせ
②try-catchの組み合わせ
③try-finalyの組み合わせ

try文だけで、記載するとコンパイルエラーになります。
finalyブロックは、例外の発生有無に問わず必ず処理されます。

catch文の中でreturn文がある場合の処理される順番

catch文の中でreturn文があると処理される順番が決まっています。


finalyブロックの処理が先に優先されて処理されます。


処理としてはcatch→finallyと実行されるのですが、return文をする前にfinallyが実行されるということです。

catchブロックとfinallyにreturnがある場合

catchブロックとfinallyにreturnがある場合も変わってきます。


finallyブロックの値で上書きされます。


というのもcatch文の戻り値があり、finallyブロックで上書き処理をしても反映されるのはプリミティブ型だけでcatch文の戻りを上書きしません。
参照型の場合は上書きされます。

throwsとthrowについて

throws句とthrow句は例外を意図的に投げることができます。

throwsは、呼び出し元に例外を投げます。
下記サンプルコードです。

public static void main(String[] args) {

Test obj = new Test();
        try{
            obj.method();
        }catch (ArrayIndexOutOfBoundException e){
             System.out.println("例外発生");   
        }
}

public void method() throws ArrayIndexOutOfBoundsException{

       int a[] = {1,2,3}

       for(int i = 0; i < 4; i++){
             System.out.println(a[i]);
       }
}


throwは、例外を意図的に発生させます。
下記が、サンプルコードです。

public void method() {

       int a[] = {1,2,3};

       for(int i = 0; i < 3; i++){
             System.out.println(a[i]);
       }
       throw new RuntimeException("例外");

 }
継承関係とオーバーライド時の注意

throws句では、指定されたメソッドをオーバーライドした際のルールがありますので覚えておきましょう。

・サブクラスがスローする例外は、スーパークラスのメソッドと同様かそのサブクラスとする。
・サブクラスのスローする例外はRuntimeExcepitonおよびRuntimeExcepitonのサブクラスの例外はスーパークラスに関係なくスローできる。
スーパークラスにスローがあってもサブクラスでスローしないことは可能。

スーパークラスでArrayindexoutofboundsexceptionをthrowsし、サブクラスでIndexoutofboundsexceptionをthrowsするのはエラーになります。
※ArrayindexoutofboundsexceptionはIndexoutofboundsexceptionのサブクラスであるため

try-catch文にも継承関係のルールがあります。

・catch文でcatchする例外はサブクラスから順番に書く。

こちらがサンプルコードです。

      try{
           obj.method();
      }catch(Exception e) {
            System.out.println("例外発生");
      }
      catch (ArrayIndexOutOfBoundsException e){
            System.out.println("例外発生");
      }
 


スーパークラスで例外をcatchすると到達不可能になるためです。

さいごに

最後まで読んでいただき、ありがとうございました。

もし、記載している内容が間違えていれば遠慮なくコメントしてください!


私自身の勉強になりますし、他の人がこの記事を見た時に間違えた情報を見ることになってしまうので