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 块。

由于在 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 != nullclose

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

不要对 if 使用 try catch,反之亦然。

Try/catch 用于在您无法控制的情况下出现问题并且这不是正常程序流程的一部分,例如写入已满的硬盘......

使用 if 进行正常的错误检查

在您的示例中,使用 if 块检查您的 args 数组,然后初始化您的 fin。

于 2012-11-11T04:35:35.570 回答
0

FileInputStream fin=null;

分配它nullFileInputStream对象。

局部变量在使用前需要赋值。

于 2012-11-11T04:21:17.263 回答
0

尽管在第一个try块中,您正在初始化finas fin = new FileInputStream(args[0]);,但您的嵌套语句会使编译器感到困惑。只需更新您的声明如下:

      FileInputStream fin = null;
于 2012-11-11T04:21:36.570 回答