有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在本地块内初始化的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
  }
}

共 (2) 个答案

  1. # 1 楼答案

    问题是,如果new FileInputStream("data")抛出,那么file变量将不会从最后一个块中设置。你可以通过使用资源来解决这个问题

    try (FileInputStream file = new FileInputStream("data")){
    }
    catch(IOException exc){
        System.out.println("Error Occured!");
    }
    

    如果您确实尝试使用资源,那么您将不需要最后一个块来关闭流。。。。java将为您关闭它

    您也可以在最后一个块中关闭它之前检查它是否为null

  2. # 2 楼答案

    错误是可能未初始化,如果构造函数抛出一个Exception(它可能会这样做),则可能未初始化。或者,您可以使用^{} close,它将为您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) {
        }
      }
    }