LoginSignup
1
1

More than 3 years have passed since last update.

【Java Silver】(例外処理)try-catch-finally文とtry-with-resource文について

Last updated at Posted at 2020-10-10

try-catch-finally文とtry-with-resource文

どちらも例外処理を記述するための構文。

※例外処理とは

Javaの例外には、Error、Exception(検査例外)、RuntimeException(非検査例外)がある。

Errorはプログラムでは対処できない問題(※コンパイルエラーとは異なり、あくまで例外
Exception(検査例外)は、例外発生時の処理を記述しないとコンパイルエラーが発生する問題
RuntimeException(非検査例外)は、例外発生時の処理が任意の例外。
 Exceptionのサブクラスなので、先にExceptionをキャッチするcatchブロックを書いたあとで、RuntimeExceptionをキャッチするcatchブロックを書くと、到達不能コードとなりコンパイルエラーが発生する

メソッドに例外を無視させる・メソッドから例外を発生させる

throws : メソッド内で該当の例外が発生した場合、自信のメソッド内でcatchするのではなく、呼ばれる側に例外を投げる処理。検査例外をスローするメソッドは、throwsでスローする可能性を宣言しなくてはならない。

例)

public test() throws IndexOutOfBounsException {
   //処理
}

→処理の過程でIndexOutOfBounsException が発生しても、testメソッドは無視。testメソッドを実行した側にIndexOutOfBoundsExceptionが発生する。

throw : メソッドから例外を発生させる
例)

public test(){
  throw new IndexOutOfWxception();
}

→testメソッドを実行すると、testメソッドにIndexOutOfWxception例外が発生する

try-catch-finally文

・tryブロック:例外が発生する可能性がある処理
・catchブロック:例外が発生した時の処理
・finallyブロック:どのような場合でも一番最後に実行する処理

【try-catch-finally文の例】

※return処理は、finally文の実行後に行われる

public class Main {
    public static void main(String[] args){
     System.out.println(test(null));  

    //finallyブロックの処理
    //引数がnullです

   //と表示される

     System.out.println(test(10));

  //引数の値は10
  //finallyブロックの処理
  //引数は有効でした

   //と表示される

  }

    public static String test(Object obj){
        try{
            System.out.println("引数の値は" + obj.toString());
        }catch(NullPointerException e){
            return "引数がnullです";
        }finally{
            System.out.println("finallyブロックの処理");
        }
        return "引数は有効でした";
    }
}

try-with-resource文

例外が発生した時に、自動的にリソースのcloseメソッドを呼び出して、リソースを解放する構文

・処理の実行順
①closeメソッドでリソースを解放する
②catchブロックの例外処理を行う
③finallyブロックの処理を行う

※例外処理よりも先にリソースの解放を行う

【try-with-resource文の例】
(Java Silver黒本より)

public class Main {
    public static void main(String[] args){
     try(Sample s = new Sample()){
         throw new Exception();  //Exceptionを発生させる
     }catch(Exception e){
         System.out.println("A");
     }finally{
         System.out.println("B");
     }
  }
}

class Sample implements AutoCloseable{
    public void close() throws Exception{
        System.out.println("C");  //closeメソッド実行時にはCと表示される
    }
}


「C A B」と表示される。
closeメソッド→catchブロック→fianllyブロックの順に実行されるため

参考)
公式ドキュメント・AutoCloseableインターフェース

閉じられるまで、リソース(ファイルやソケット・ハンドルなど)を保持できるオブジェクト。
AutoCloseableオブジェクトのclose()メソッドは、リソース指定ヘッダーでそのオブジェクトが宣言されているtry-with-resourcesブロックの終了時に自動的に呼び出されます。
この構築によって即時解放が確保され、それ以外の場合に発生する可能性のあるリソース不足例外およびエラーを回避できます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1