流对象初始化

时间:2012-11-11 04:18:49

标签: java object stream initialization

现在我在第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 个答案:

答案 0 :(得分: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
    }
}

更多信息:

答案 1 :(得分:0)

FileInputStream fin=null;

分配nullFileInputStream对象。

在使用之前,需要将局部变量分配给某个值。

答案 2 :(得分:0)

虽然在第一个try块中,您正在将fin初始化为fin = new FileInputStream(args[0]);,但您的嵌套语句会混淆编译器。只需更新您的声明如下:

      FileInputStream fin = null;

答案 3 :(得分:0)

不要将try catch用于if,反之亦然。

尝试/捕获是指当你的控件背后出现问题时,这不是正常程序流程的一部分,例如写入已满的硬盘....

使用if进行正常错误检查

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