try-catch文とは?
try-catch文とは、Javaでtryとcatchという2つブロックを使用して記述された例外処理の文です。
通常、実行される場合の処理をtryブロックに、例外発生時に実行される場合の処理をcatchブロックに分けて記述します。
try{ (通常実行される文) }catch(例外クラス 変数名){ (例外発生時に実行される文) }
try-catch文の使い方・書き方
例外処理に使うのは何となくわかりました。具体的な書き方も知りたいです。
では、ここからはtry-catch文の具体的な使い方・書き方を見ていきましょう。
まずは、基本的なtry-catch文の使い方・書き方をご紹介します。
import java.io.*; public class Main{ public static void main(String[] args){ try{ FileReader fr = new FileReader("sample.txt"); System.out.println("sample.txtを読み込みました。"); }catch(Exception e){ System.out.println("例外が発生しました。"); System.out.println(e); } } }
上記のサンプルコードは、sample.txtというファイルを読み込むためのプログラムです。
tryブロックの中で、「sample.txtというファイルの読み込み」と、「読み込みが成功したことを示す文字列を表示」させます。
catchブロックの中では、「sample.txtというファイルの読み込みができなかったことを示す文字列の表示」と、「Exceptionの例外をスロー」します。
sample.txtファイルを読み込めなかった場合の実行結果は、以下のようになります。
例外が発生しました。 java.io.FileNotFoundException: sample.txt (No such file or directory)
try-catch文で複数の例外をcatchする方法
try-catch文で複数の例外処理を記述したいときは、catchブロックを複数個つくればOKです。
以下のプログラムでは、2個のcatchブロックをつくっています。
import java.io.*; public class Main{ public static void main(String[] args){ try{ FileReader fr = new FileReader("sample.txt"); System.out.println("sample.txtを読み込みました。"); Class c = Class.forName("sampleClass"); System.out.println("クラスを読み込みました"); }catch(FileNotFoundException e){ System.out.println("ファイル読み込みの例外が発生しました。"); System.out.println(e); }catch(ClassNotFoundException e){ System.out.println("クラス読み込みの例外が発生しました。"); System.out.println(e); } } }
ファイルとクラスの例外を分けるために、「Exception」を「FileNotFoundException」と「ClassNotFoundException」に分割しました。
Exception系のエラーについては、さまざまな種類があるので以下のサイトを参考にしてみるといいでしょう。
sample.txtファイルは読み込めたけど、クラスの読み込みができなかった場合の実行結果は、以下のようになります。
sample.txtを読み込みました。 クラス読み込みの例外が発生しました。 java.lang.ClassNotFoundException: sampleClass
try-catch文で必ず実行する処理は、finallyで対応する
例外が発生してもしなくても、強制終了になるときでも、必ず実行しなければいけない処理を実行にするには、finallyブロックを使います。
finallyブロックは、以下のようにcatchブロックの下に記述します。
try{ (通常実行される文) }catch(例外クラス 変数名){ (例外発生時に実行される文) }finally{ (例外があってもなくても必ず実行する文) }
先ほどのファイルとクラスの読み込みプログラムに、finallyブロックを追加したプログラムが以下になります。
import java.io.*; public class Main{ public static void main(String[] args){ try{ FileReader fr = new FileReader("sample.txt"); System.out.println("sample.txtを読み込みました。"); Class c = Class.forName("sampleClass"); System.out.println("クラスを読み込みました"); }catch(FileNotFoundException e){ System.out.println("ファイル読み込みの例外が発生しました。"); System.out.println(e); }catch(ClassNotFoundException e){ System.out.println("クラス読み込みの例外が発生しました。"); System.out.println(e); }finally{ System.out.println("---例外があってもなくても表示します。---"); } } }
上記のプログラムを実行した場合の実行結果は、以下のようになります。
sample.txtを読み込みました。 クラス読み込みの例外が発生しました。 java.lang.ClassNotFoundException: sampleClass ---例外があってもなくても表示します。---
try-catch文で例外を発生させる処理は、throwで対応する
JVMに例外的状況を報告することを「例外を投げる」や「例外を送出する」といいます。
例外を投げるためには、throwキーワードを使いましょう。
JVMとは、正式名称「Java Virtual Machine」で、Javaのプログラムを動かすために必要なソフトウェアのことです。
実際に、例外を投げるプログラムの例を見ていきましょう。
↓Main.java
public class Main{ public static void main(String[] args){ Human h = new Human(); h.setAge(-50); } }
↓Human.java
public class Human{ int age; public void setAge(int age){ if(age < 0){ throw new IllegalArgumentException("正の値を指定してください。指定値=" + age); } this.age = age; } }
HumanクラスのsetAge()メソッドでは、ageが負の値になるのを防ぐために、代入する前に引数の判定をします。
引数が負の値だった場合は、IllegalArgumentExceptionインスタンスを投げ、例外的状況になったことをJVMに報告する、といった流れです。
上記のプログラムを実行した場合の実行結果は、以下のようになります。
Exception in thread "main" java.lang.IllegalArgumentException: 正の値を指定してください。指定値=-50 at Human.setAge(Human.java:5) at Main.main(Main.java:5)
try-catch文でオリジナルの例外クラスを定義する方法
Javaでは、既存の例外クラスを継承して、オリジナルの例外クラスをつくることも可能です。
ここでは、ひとつのオリジナルの例外処理をご紹介します。
↓Main.java
public class Main{ public static void main(String[] args){ try{ // 例外処理を発生させます throw new UnsupportedOriginalException("オリジナルの例外処理です。"); }catch(Exception e){ System.out.println("例外が発生しました。"); System.out.println(e); } } }
↓UnsupportedOriginalException.java
public class UnsupportedOriginalException extends Exception{ public UnsupportedOriginalException(String msg){ super(msg); } }
UnsupportedOriginalExceptionの継承元になるクラスはExceptionになっています。
上記のプログラムを実行した場合の実行結果は、以下のようになります。
例外が発生しました。 UnsupportedOriginalException: オリジナルの例外処理です。
このようにさまざまな例外的状況を想定し、オリジナルの例外クラスとして作成できると、きめ細かいエラーの対処が可能になるでしょう。
まとめ
try-catch文の使い方・書き方についてご紹介しました。
Javaではファイルの読み込む処理を実行する場合、例外処理の記述がないとコンパイルエラーになってしまいます。
ぜひこの記事を参考に、例外処理の使い方をマスターしてください。
finally必ず使うべき状況
などの後片付け処理は、必ずfinallyブロックに記述しましょう。