実際にリスト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のプログラムと、大部違ったものに 見えるかと思いますが、行っている処理は、機能的には、同じものです。
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の最初の関門かもしれません。 簡単な サンプルを紹介しましたが、この働きが理解できれば、当面は、十分だと思います。