はじめに
皆さん。こんにちは!
DreamHanksの254cmです。
今回は例外処理について説明していきます。
Java記事のまとめはこちらです。
前回の記事は【Java開発】第18回 インターフェースです。
例外とエラー
プログラムが動作する途中に不測の事態が発生され、実行中のプログラムの影響を受けることにはエ
ラー(error)と例外(exception)の2つがあります。
〇エラー
エラーはJVMで発生される問題として、プログラムで制御することができない問題を意味します。
例えばStackメモリーにオーバーフローが発生されることがあります。
〇例外
例外はエラーと似たようなものですが、プログラムで例外発生に対応することが異なります。
代表的なのが指定された経路にファイルが存在しなかった場合に発生されるFileIOExceptionがあり
ます。
try/catch/finally
javaでは例外処理のためにtry/catch/finally文を提供しています。
1.try
try/catch/finally文で最初に実行されます。try文のソースコードで発生された
例外はcatchブロックで対応します。
2. catch
tryブロックで発生された例外が引数として伝達され、その例外の対応を行います。
3. finally
finallyブロックは例外発生有無に関係せず、必ず実行されます。
※catchブロックとfinallyブロックは必須ではありません。しかし、try単独で使うことはできないです。
try/catch/finallyの書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
try { 例外処理を行いたいソースコード } catch (e1) { e1例外が発生された場合、実行されるソースコード } catch (e2) { e2 例外が発生された場合、実行されるソースコード } ... finally { 例外発生有無と関係なき、実行されるソースコード } |
上記のソースコードのe1とe2は例外クラスのインスタンスであります。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 |
public class ExceptionSample { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader(new File("C:\\test.txt"))); } catch (FileNotFoundException e) { System.out.println("fileが見つかりません。"); } } } |
上記のサンプルはtryでBufferedReaderクラスでファイルの内容を読んでいます。
そして、指定した経路でファイルがなかった場合、catchが実行されるように書かれています。
catchの括弧では対応したい例外のクラスのインスタンスを作成します。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class ExceptionSample { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader(new File("C:\\test.txt"))); } catch (FileNotFoundException e) { System.out.println("fileが見つかりません。"); } //catchは重複使用ができます。 catch (Exception e) { System.out.println("例外が発生されました。"); } finally { System.out.println("try/catch/finally終了"); } } } |
上記のサンプルを見ると二つのcatchが使われています。
上記のtry/catch/finallyはFileNotFoundExceptionクラスで例外の対応ができなかった場合、
Exceptionクラスで対応するように作成されています。
様々な例外が発生する可能性があるソースコードを例外処理する際に、
上記のサンプルのようにcatchを複数使用して種々の例外を対応することができます。
※複数使用ができるものはcatchしかないです。
サンプル3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class ExceptionSample { public static void main(String[] args) { try { System.out.println("try実行"); } finally { System.out.println("finally実行"); } try { System.out.println("try実行"); } catch (Exception e) { System.out.println("例外発生"); } } } |
上記のようにcatchまたはfinallyを適切に組み合わせて使うこともできます。
しかし、tryを単独で使うことはできないし、tryなしにcatch/finallyだけを使をこともできません。
try/catch/finallyの実行順序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class ExceptionSample { public static void main(String[] args) { try { try { System.out.println("実行1"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("実行2"); } catch (NullPointerException e2){ System.out.println("実行3"); } } catch (Exception e) { System.out.println("実行4"); } finally { System.out.println("実行5"); } } } |
1.tryブロックのソースコードが実行されます。その時、例外が発生されず、finallyブロックがあった場合 、finallyブロックが実行されます。
2.tryブロックで例外が発生されるとcatchハンドラーは次のような順で適切なcatchブロックを探します。
2.1 stackでtryブロックと一番近いcatchブロックから検査します。
2.2 適切なcatchブロックを探せなかった場合、外側のcatchブロックを検査します。
2.3 それでも適切なcatchブロックを探せなかった場合、例外は処理できないです。
3.適切なcatchを探した場合、例外オブジェクトが引数としてcatchに渡されます。
4.すべての例外処理が終わるとfinallyが実行されます。
5.finallyのソースコードが終了されるとtry/catch/finallyが終了されます。
終わりに
今回の記事は以上になります。
次回はExceptionクラスを学びましょう。
ご覧いただきありがとうございます。
コメント