pafuイーランスクール 学んでできる

メニューへ戻る

8章 例外処理

学習のポイント

想定外のエラーを回避する「例外処理」のコーディング、及び「例外をかわす」「例外を投げる」を理解しましょう。

1. 例外とは?
例外とは、「Exception」とも言います。これは、Javaのプログラムが予期しないエラーが発生した場合に、適切にプログラムが終了するように定義するものです。一般的に「エラーのハンドリング」とも言います。
2. 例外の文法
例外文 意味
tryブロック 例外をスローする処理を記述します。
catch節 例外の指定。
catchプロック 例外に対する処理を記述します。
finallyブロック 例外の有無に関わらず必ず実行される処理を記述します。
通常は、以下のようになります。

public class Pafu {
 try {
  //例外をスローする処理を記述します。
 }
 catch (例外クラス名 例外パラメータ) {
  //例外に対する処理を記述します。
 }
 //catch文は複数指定できます。
 finally {
  //例外の有無に関わらず、必ず実行される処理を記述します。
 }
}

3. 実際にやって見よう!
以下のプログラムは、ファイルから情報を読取り、画面に表示するクラスです。

import java.io.*;
public class CFileIO {
  BufferedReader fin;
  public void disp(String fname) {
   try {
    //ファイルのオープン
    BufferedReader fin = new BufferedReader(new FileReader(fname));
    //画面へファイルの内容を表示
    String ww;
    while((ww = fin.readLine()) != null ) {
     System.out.println(ww);
    }
    //ファイルのクローズ処理
    fin.close();
   }
   catch (FileNotFoundException fn) {
    System.err.println(fname + "が見つかりませんでした。");
   }
   catch (IOException iow) {
    System.err.println("ファイルのIOエラーです。");
   }
   finally {
    try {
      //ファイルのクローズ処理
      if (fin != null) {
       fin.close();
      }
    } catch (IOException opw) {
      System.err.println("ファイルのクローズ処理に失敗。");
    }//try
   }//try
 }//disp
}//class

実際の処理は、以下のようになります。

public class CMain {
 public static void main (String[] args) {
   CFileIO fileIO = new CFileIO();
   fileIO.disp("pafu.txt");
  }
}

これで、画面に「pafu.txt」の内容が表示されます。ちなみに、「pafu.txt」をリネームして実行してみて下さい。   
4. 例外をかわす
例外処理では、上記3の方法の他に、「throws節」を使用する方法があります。これを使用すると例外処理の記述は必要ありません。但し、呼び出し側で例外処理の記述が必要となります。このような書き方を「例外をかわす」といいます。上記の処理をこれを使用して、書き直して見ましょう。

import java.io.*;
public class CFileIOThrow {
  BufferedReader fin;
  public void disp(String fname)
            throws FileNotFoundException,IOException {
    //ファイルのオープン
    BufferedReader fin = new BufferedReader(new FileReader(fname));
    //画面へファイルの内容を表示
    String ww;
    while((ww = fin.readLine()) != null ) {
     System.out.println(ww);
    }
    //ファイルのクローズ処理
    fin.close();
 }//disp
}//class

実際の処理は、以下のようになります。

import java.io.*;
public class CMain2 {
 public static void main (String[] args) {
  try {
   CFileIOThrow pa3 = new CFileIOThrow();
   pa3.disp("pafu.txt");
  }
  catch (FileNotFoundException fn) {
   System.err.println("pafu.txt が見つかりませんでした。");
  }
  catch (IOException iow) {
   System.err.println("ファイルのIOエラーです。");
  }
 }

}
上記の場合、CFileIOThrowのクラスが、「throws節」を使用しているため、実際の実行クラスであるCMain2では、例外処理を記述しないとコンパイルエラーとなります
5. 例外を投げる
例えば、5個の要素からなる配列を合計を求める場合に、マイナスの場合にエラーとして例外をスローする場合、例外を明示的に「throw」文により呼びたし側へ「例外を投げる」ことが出来ます
以下のようにします。これは、合計を求めるクラスです。

public class CKeisan {
 public static int intsum(int[] hai) throws Exception {
  int goukei = 0;
  for (int i = 0; i < hai.length; i++) {
   if (hai[i] < 0 ) {
    throw new Exception("マイナスのデータがあります。");
   }
   goukei += hai[i];
  }
  return goukei;
 }
}

上記のクラスでは、データがマイナスの時、例外を発生させています。実際の実行では、

public class CMain3 {
 public static void main (String[] args) {
  int[] data = {10,15,30,-25,50};
  int goukei = 0;
  try {
    goukei = CKeisan.intsum(data);
    System.out.println("合計は、" + goukei + "です。");
  } catch (Exception ee) {
    System.err.println(ee.getMessage());
  }
 }
}

これを実行すると、、「マイナスのデータがあります。」と表示されます。dataの「-25」を0以上に変更すれば、問題なく合計が表示されます。   

Javaプログラミングをもっと学びたいという方は「pafuイーランスクール」「Javaオブジェクト指向講座」よりご確認ください。また、書籍のみご希望の方は「こちら」よりご確認ください。

メニューへ戻る

pafuイーランスクール

pafuイーランスクール 学んでできる