Javaに関する様々な情報をご紹介します。

3throws、throw

Javaに関する様々な情報をご紹介します。

throws、throw

このページではJavaでの例外処理におけるthrows、throwの使用方法について説明します。

throwsの使用方法

Javaでは例外が発生したメソッド内で例外ハンドラを発見できない場合、例外ハンドラを求めてメソッド呼び出し元を逆に捜しに行きます。

throwsの基本

このとき各メソッド(この場合はBメソッド、Cメソッド)では、発生した例外の例外ハンドラをメソッド呼び出し元へ捜しに行くことを明示的に示す必要があります。その時にthrowsを使用します。 

throwsの宣言は以下の枠内のフォーマットで構成されます。throwsで指定される例外クラスの内、チェック例外は必ず指定する必要があります。指定しない場合はコンパイルエラーとなります。非チェック例外は指定しても、指定しなくても良いです。

【throwsの宣言】

メソッド名 (引数型 引数名) throws 例外クラス型,・・・

例1 throwsを使用し、呼び出し元メソッドで例外ハンドラがキャッチされた例です。

import java.io.*;

class ExException7 {
  public static void main (String[] args) {
    ExException7 Ex7 = new ExException7();
    Ex7.methodA();
  }

  void methodA(){
    try {
      methodB();  //(1)
    } catch(FileNotFoundException e) {
      System.err.println(e.getMessage());  //(3)
    } finally {
      System.out.println("MethodA was finished");  //(4)
    }
  }

  void methodB() throws FileNotFoundException {  //(2)
    FileReader exFile = new FileReader("exFile.txt");
  }
}

解説1

  1. (1)例外が発生する可能性のあるメソッド呼び出しをtry節内に記載します。
  2. (2)MethodB内でFileReaderオブジェクトexFileの生成を行っています。例外FileNotFoundExceptionが発生した場合、throwsで指定された例外クラス型に基づき、呼び出し元メソッドMethodAに例外オブジェクトをスローします。
  3. (3)catch節にて例外クラス型FileNotFoundExceptionをキャッチし、getMessageメソッドを使用して例外オブジェクトに含まれるメッセージを出力します。
  4. (4)finally節で「MethodA was finished.」を表示します。

実行結果1

D:\JAVA>javac ExException7.java 

D:\JAVA>java ExException7 
exFile.txt (指定されたファイルが見つかりません。)   ←例外処理
MethodA was finished 

D:\JAVA>

例2 throwsを使用したが呼び出し元メソッドで例外ハンドラがキャッチされなかった例です。

ExException8{
  public static void main (String[] args) {
    ExException8 Ex8 = new ExException8();
    Ex8.methodA();
  }

  void methodA() {
    try {
      methodB();  //(1)
    } finally {
      System.out.println("This program was finished");  //(3)
    }
  }

  void methodB() throws ArithmeticException {  //(2)
    System.out.println("答えは" + (100/0));
  }
}

解説2

  1. (1)例外が発生する可能性のあるメソッド呼び出しをtry節内に記載します。
  2. (2)methodB内で整数を0で除算しています。そのため、例外ArithmeticExceptionが発生し、throwsで指定された例外クラス型に基づき、呼び出し元メソッドMethodAに例外オブジェクトをスローします。
  3. (3)catch節がないため、finally節を実行します。
  4. 例外ハンドラが見つからない場合、Java実行システムはさらにメソッド呼び出し元(この場合はmainメソッド)へ、例外ハンドラを捜しに行きます。最終的に例外ハンドラが見つからなかった場合はJavaのデフォルトの例外処理を実行します。

実行結果2

D:\JAVA>javac ExException8.java 

D:\JAVA>java ExException8 
This program was finished 
Exception in thread "main" java.lang.ArithmeticException: / by zero
  at ExException8.methodB(ExException8.java:18)   
  at ExException8.methodA(ExException8.java:11)   ← デフォルト例外処理
  at ExException8.main(ExException8.java:6)     

D:\JAVA>

オーバーライド時のthrows使用方法

メソッドのオーバーライドを行う際、throwsで指定する例外クラス型の指定方法にいくつかの注意点があります。

  1. スーパークラスのメソッドで指定される例外クラス型以外のチェック例外の例外クラス型をサブクラスのメソッドで指定することはできません。非チェック例外の例外クラス型は指定可能です。
  2. スーパークラスのメソッドで指定される例外クラス型より範囲の広い例外クラス型をサブクラスのメソッドで指定することはできません。スーパークラスのメソッドで例外クラス型FileNotFoundExceptionが指定されていた場合、そのスーパークラスである例外クラス型IOExceptionをサブクラスのメソッドに指定することはできません。

throwの使用方法

throwを使用することにより任意の場所で例外を発生させることができます。以下の枠内のフォーマットによりthrowを使用します。枠内の例外オブジェクトを参照する式には「new 例外クラス」が使用されます。

【throwの宣言】

throw 例外クラスの式;

例3 コマンドライン引数に指定された値が10以上の場合、例外IllegalArgumentExceptionをスローする例です。

class ExException9{
  public static void main (String[] args) {
    int x = Integer.parseInt(args[0]);
    if(x >= 10) {
      throw new IllegalArgumentException
                ("10以下の値を入力してください");
    }
  }
}

実行結果3

D:\JAVA>javac ExException9.java 

D:\JAVA>java ExException9 20 
Exception in thread "main" java.lang.IllegalArgumentException: 10以下の値を入力 してください
   at ExException9.main(ExException9.java:7) 

D:\JAVA>

3throws、throw