Java 速習チュートリアル

Java 例外処理(Try...Catch)

1. Java例外(Java Exceptions)

「エラー(Errors)」の章で述べたように、プログラムの実行中には、コーディングのミス、無効な入力、あるいは予期しない状況など、さまざまなタイプのエラーが発生する可能性があります。

エラーが発生した際、Javaは通常、処理を停止してエラーメッセージを生成します。これを専門用語で「Javaが例外(Exception)をスローする(エラーを投げる)」と呼びます。

2. 例外処理(try と catch)

例外処理(Exception handling)を使用すると、ランタイム(実行時)にエラーをキャッチして処理できるため、プログラムがクラッシュするのを防ぐことができます。

これには以下のキーワードを使用します。

  • try 文:実行中にエラーがないかテストするためのコードブロックを定義します。
  • catch 文:try ブロック内でエラーが発生した場合に実行されるコードブロックを定義します。

trycatch は常にペアで使用されます。

2.1 基本構文

try {
  // テストするコードブロック
} catch (Exception e) {
  // エラーをハンドリングするコードブロック
}

以下の例を考えてみましょう。このコードは myNumbers[10] が存在しないため、エラーを生成します。

public class Main {
  public static void main(String[ ] args) {
    int[] myNumbers = {1, 2, 3};
    System.out.println(myNumbers[10]); // エラーが発生!
  }
}

出力は以下のようになります。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
        at Main.main(Main.java:4)

       注意:ArrayIndexOutOfBoundsException は、存在しないインデックス番号にアクセスしようとしたときに発生します。

エラーが発生した場合、try...catch を使用してエラーをキャッチし、それを処理するためのコードを実行できます。

例:

public class Main {
  public static void main(String[ ] args) {
    try {
      int[] myNumbers = {1, 2, 3};
      System.out.println(myNumbers[10]);
    } catch (Exception e) {
      System.out.println("何かがうまくいきませんでした。");
    }
  }
}

出力:

何かがうまくいきませんでした。

3. Finally 文

finally 文を使用すると、try...catch の結果に関わらず、その後のコードを実行することができます。

例:

public class Main {
  public static void main(String[] args) {
    try {
      int[] myNumbers = {1, 2, 3};
      System.out.println(myNumbers[10]);
    } catch (Exception e) {
      System.out.println("何かがうまくいきませんでした。");
    } finally {
      System.out.println("'try catch' 処理が完了しました。");
    }
  }
}

出力:

何かがうまくいきませんでした。
'try catch' 処理が完了しました。

4. throw キーワード

throw 文を使用すると、カスタムエラーを作成(スロー)することができます。

throw 文は、例外タイプ(Exception type)と一緒に使用されます。Javaには、ArithmeticExceptionFileNotFoundExceptionArrayIndexOutOfBoundsExceptionSecurityException など、多くの例外タイプが用意されています。

例:age が18歳未満の場合は例外をスローし("アクセス拒否"を表示)、18歳以上の場合は "アクセス許可" を表示します。

public class Main {
  static void checkAge(int age) {
    if (age < 18) {
      throw new ArithmeticException("アクセス拒否 - 18歳以上である必要があります。");
    }
    else {
      System.out.println("アクセス許可 - 十分な年齢です!");
    }
  }

  public static void main(String[] args) {
    checkAge(15); // ageを15に設定(18歳未満...)
  }
}

出力:

Exception in thread "main" java.lang.ArithmeticException: アクセス拒否 - 18歳以上である必要があります。
        at Main.checkAge(Main.java:4)
        at Main.main(Main.java:12)

もし age が20であれば、例外は発生しません。

例:

checkAge(20);

出力:

アクセス許可 - 十分な年齢です!

5. 一般的なエラーと例外タイプ

以下の表は、Javaにおける代表的なエラーと例外のリストです。

エラー / 例外説明
ArithmeticException数値計算でエラー(ゼロ除算など)が発生した際に発生
ArrayIndexOutOfBoundsException配列の存在しないインデックスにアクセスしようとした際に発生
ClassNotFoundException存在しないクラスにアクセスしようとした際に発生
FileNotFoundExceptionファイルにアクセスできない(ファイルが見つからない)際に発生
InputMismatchException不適切な入力(数値入力にテキストを入力するなど)が行われた際に発生
IOException入出力操作が失敗した際に発生
NullPointerExceptionnull であるオブジェクト参照にアクセスしようとした際に発生
NumberFormatException指定された文字列を数値型に変換できない際に発生
StringIndexOutOfBoundsException文字列の存在しない文字位置にアクセスしようとした際に発生