现在我在第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块中而错过初始化,因此错误?
答案 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;
分配null
或FileInputStream
对象。
在使用之前,需要将局部变量分配给某个值。
答案 2 :(得分:0)
虽然在第一个try
块中,您正在将fin
初始化为fin = new FileInputStream(args[0]);
,但您的嵌套语句会混淆编译器。只需更新您的声明如下:
FileInputStream fin = null;
答案 3 :(得分:0)
不要将try catch用于if,反之亦然。
尝试/捕获是指当你的控件背后出现问题时,这不是正常程序流程的一部分,例如写入已满的硬盘....
使用if进行正常错误检查
在您的示例中,使用if块检查args数组,然后初始化fin。