在本地块内初始化的java引用类型在本地块外未初始化
在下面的代码中,我在try-catch块之外声明了一个引用类型变量。然后我在try块中初始化它,并在final块中再次尝试使用它。但是编译器警告我变量在最后一个块中未初始化
据我所知,因为我已经在try块中初始化了file
变量,所以在最后一个块中它不应该为null
import java.io.*;
class test {
public static void main (String ... args) throws IOException{
FileInputStream file;
// Solution : FileInputStream file = null;
try {
file = new FileInputStream("data");
}
catch(IOException exc) {
System.out.println("Error Occured!");
}
finally {
file.close(); // Error : variable file might not have been initialized
}
}
}
我通过将文件变量初始化为null解决了这个问题
我的问题是,为什么在try块中初始化一个引用变量后,该变量在最后一个块中仍保持未初始化状态
我在初始化if
语句中的file
变量时遇到了相同的问题
import java.io.*;
class test{
public static void main (String ... args) throws IOException{
FileInputStream file;
// Solution : FileInputStream file = null;
int i = 0;
if(i > 5){
file = new FileInputStream("data");
}
file.close(); // Error : variable file might not have been initialized
}
}
# 1 楼答案
问题是,如果
new FileInputStream("data")
抛出,那么file
变量将不会从最后一个块中设置。你可以通过使用资源来解决这个问题如果您确实尝试使用资源,那么您将不需要最后一个块来关闭流。。。。java将为您关闭它
您也可以在最后一个块中关闭它之前检查它是否为null
# 2 楼答案
错误是可能未初始化,如果构造函数抛出一个} close ,它将为您
Exception
(它可能会这样做),则可能未初始化。或者,您可以使用^{close()
或者