在下面的代码中,我在try-catch块之外声明了一个引用类型变量。然后我在try块中初始化它并尝试在final块中再次使用它。但是编译器警告我在最后一个块中未初始化的变量。
据我了解,由于我已经在try块中初始化了file
变量,因此在最后一个块中它不应该为空。
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块中初始化一个引用变量之后,变量在最后一个块中仍然保持未初始化状态?
在file
语句中初始化if
变量时遇到同样的问题,
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
}
}
答案 0 :(得分:3)
问题是如果new FileInputStream("data")
抛出,那么file
变量将不会在最后一个块中设置。您可以通过捕获资源来解决此问题。
try (FileInputStream file = new FileInputStream("data")){
}
catch(IOException exc){
System.out.println("Error Occured!");
}
如果您尝试使用资源,那么您将不需要最后一个块来关闭流.... java将为您关闭它。
您还可以在最后一个块中关闭它之前检查它是否为null。
答案 1 :(得分:1)
错误是可能未初始化,如果构造函数抛出Exception
(它可能),则可能是错误。或者,您可以使用close()
为您try (InputStream file = new FileInputStream("data")) {
// ...
}
catch(IOException exc){
// What error.
System.out.println("Error Occurred! " + exc.toString());
exc.printStackTrace();
}
finally {
if (file != null) {
try {
file.close();
} catch (Exception ignored) {
}
}
}
或者,
{{1}}