2

30行目と38行目で、「fin」が初期化されていない可能性があるというコンパイル時エラーが発生しています。しかし、このように書くのは完璧です

 import java.io.*;
    class CopyFile {
        public static void main(String args[]) throws IOException {
            int i;
            FileInputStream fin;//can't it be done like this?
            FileOutputStream fout= new FileOutputStream(args[1]);

            try{
                //open input file
                try{
                    fin = new FileInputStream(args[0]);
                }
                catch(FileNotFoundException e){
                    System.out.println("Input file Not Found");
                    return;
                }
                //open output file
                try{
                    fout = new FileOutputStream(args[1]);
                }
                catch(FileNotFoundException e){
                    System.out.println("Error Opening File");
                }
            }
            catch(ArrayIndexOutOfBoundsException e){
                System.out.println("usage: Copyfile From to");
            }
            try{
                do{
                    i = fin.read();
                    if(i!= -1)
                        fout.write(i);
                }while(i != -1);
            }
            catch(IOException e){
                System.out.println("file error");
            }
            fin.close();
            fout.close();
        }
    }

私はそれがこのように初期化されるのを何度も見てきました。トライブロックによるものだと思います。

tryブロックにあるために初期化を見逃し、エラーが発生する可能性がありますか?

4

4 に答える 4

3

問題は、をまったく初期化していないことですFileInputStream fin。コンパイラにとって、コードは次のようになります。

FileInputStream fin;
try {
    fin = ...
    //more code goes here...
} catch (...) {
    //exception handling...
} finally {
    fin.close(); //fin is not even null for the compiler
}

コードを機能させるには、少なくともnull値を使用してコードを初期化し、メソッドfin != nullを使用する前に確認してください。close

FileInputStream fin = null;
try {
    fin = ...
    //more code goes here...
} catch (...) {
    //exception handling...
} finally {
    if (fin != null) {
        fin.close(); //fin is not null, at least the JVM could close it
    }
}

より詳しい情報:

于 2012-11-11T04:25:42.460 に答える
0

FileInputStream fin=null;

nullそれまたはFileInputStreamオブジェクトを割り当てます。

ローカル変数は、使用する前に何らかの値に割り当てる必要があります。

于 2012-11-11T04:21:17.263 に答える
0

最初のtryブロックでは、として初期化していますがfinfin = new FileInputStream(args[0]);ネストされたステートメントはコンパイラを混乱させます。以下のように宣言を更新してください。

      FileInputStream fin = null;
于 2012-11-11T04:21:36.570 に答える
0

ifにtrycatchを使用しないでください。その逆も同様です。

try / catchは、制御の背後で問題が発生した場合に使用します。これは、たとえば、満杯のハードディスクへの書き込みなど、通常のプログラムフローの一部ではありません。

通常のエラーチェックに使用する場合

この例では、ifブロックを使用してargs配列を確認してから、finを初期化します。

于 2012-11-11T04:35:35.570 に答える