3

我正在尝试执行此代码,并且我还提供了有效的参数,但我仍然在第 1 行遇到错误。从图 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

2

fin编译器是对的(这本书是错的,他们应该在发布之前尝试编译他们的代码):当代码到达行时仍未初始化时,有一条通过代码的路径fin.read()

具体来说,如果ArrayIndexOutOfBoundsException在第一个外部try/catch块中被抛出,fin则不会分配该变量。添加return到外部catch块应该可以解决这个问题:

try {
    ...
} catch(ArrayIndexOutOfBoundsException e){
    System.out.println("Array index out of bound exception");
    return; // <<== Here
}

使用该return语句,控制将永远不会到达已初始化的fin.read()除非fin已初始化,从而修复了编译时错误。

于 2013-04-24T15:47:03.067 回答
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 回答