実際にリスト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の最初の関門かもしれません。 簡単な サンプルを紹介しましたが、この働きが理解できれば、当面は、十分だと思います。