在本地块内初始化的引用类型在本地块之外未初始化

时间:2015-02-08 04:56:20

标签: java

在下面的代码中,我在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
  }
}

2 个答案:

答案 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}}