next up previous contents
Next: readwrite Up: File I/O Previous: try と catch

try , catch での例外処理

実際にリスト2のプログラムでどのようなエラー・メッセージが返ってくるか 実験してみましょう。次の出力を見てください。簡単なコメントがついていますので、 何が問題なのかは分かると思います。

topos$ java Copy1 cp3.java       <------  引数が一つしかない。
Exception: java.lang.ArrayIndexOutOfBoundsException: 1

topos$ java Copy1 cpx.java tmp   <------  存在しないファイル(cpx.java)を指定。
Exception: java.io.FileNotFoundException: cpx.java

topos$ java Copy1 cp3.java /     <------  第二引数にディレクトリを指定。
Exception: java.io.FileNotFoundException: /

topos$ chmod a-r cp3.java        <------  cp3.java の読みだしを禁止。
topos$ java Copy1 cp3.java tmp
Exception: java.io.FileNotFoundException: cp3.java

次のリスト2-1は、try,catch を利用して、リスト2-1のプログラムに、もう少し、 丁寧にエラー処理を行ったものです。見掛け上、Cのプログラムと、大部違ったものに 見えるかと思いますが、行っている処理は、機能的には、同じものです。

リスト 2-1

import java.io.*;

class Copy {
  static final int BUFSIZE = 80 ;

  public static void main (String argv[]){
     try {
       FileInputStream   in  = new FileInputStream(argv[0]);
       FileOutputStream  out = new FileOutputStream(argv[1]);
       byte buff[] = new byte[BUFSIZE] ;
       int len ;

       while( (len = in.read(buff,0,BUFSIZE)) != -1 ){
          out.write(buff,0,len);
       }

     } catch (ArrayIndexOutOfBoundsException e ){
          System.err.println( "引数が2個必要です。"  );
     } catch (FileNotFoundException e ){
          System.err.println( "ファイルが存在しないか、読み書き出来ません。: " + e.getMessage() );
     } catch (IOException e ){
          System.err.println( "入出力エラーが発生しました。: " + e );
     } catch (Exception e ){
          System.err.println( "エラーが発生しました。: " + e );
     }
  }
}

このJavaプログラムを動かした時の出力例です。

topos$ java Copy cp3.java       <------  引数が一つしかない。
引数が2個必要です。

topos$ java Copy cpx.java tmp   <------  存在しないファイル(cpx.java)を指定。
ファイルが存在しないか、読み書き出来ません。:cpx.java

try, catch は、Cプログラマにとって、Javaの最初の関門かもしれません。 簡単な サンプルを紹介しましたが、この働きが理解できれば、当面は、十分だと思います。



maruyama@wakhok.ac.jp