3

このコードを実行しようとしていますが、有効な引数も提供していますが、まだ行番号でエラーが発生しています。34 と 35 では、ローカル変数 fin と fout が初期化されていない可能性があります。これを解決する方法enter code here

 package maxbj.myTest.p1;
import java.io.*;
public class CopyFile {
public static void main(String[] args)throws IOException {

    int i;
    FileInputStream fin;
    FileOutputStream fout;

    try{
        //trying to open input file
        try{
            fin=new FileInputStream(args[0]);
        }catch(FileNotFoundException e){
            System.out.println("Input file not found");
            return;
        }

        //trying to open output file
        try{
            fout=new FileOutputStream(args[1]);
            return;
        }catch(FileNotFoundException e){
            System.out.println("Output file cannot be opened or created");
            return;
        }       
    }catch(ArrayIndexOutOfBoundsException e){
        System.out.println("Array index out of bound exception");
    }

    //code to copy file
    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();
}
}

PS-このコードは、本「JAVA COMPLETE REFRENCE」からのものです

4

2 に答える 2

1

これを回避する簡単な方法は、try ブロック内で fin と fout を必要とするすべてを実行することです。このようにして、ストリームを開くのに失敗したときにストリームを使用しようとすることは決してありません。

try
{
    fout = new FileOutputStream(...);
    fin = new FileInputStream(...);

    // Code goes here

    fout.close();
    fin.close();
}
catch(FileNotFoundException e)
{
    // Error code - e should contain the file name/path
}

また、変数を宣言するときに変数を初期化することをお勧めします。

FileOutputStream fout = null;
FileInputStream fin = null;

ただし、この方法 (null に初期化するだけ) のプログラミング ロジックではコンパイラ エラーは発生しませんが、正しく処理されないと、ブロックをスローしようとすると NullPointerExceptions が発生する可能性があります。

于 2013-04-24T16:02:20.193 に答える