gpt4 book ai didi

java - 在本地 block 内初始化的引用类型在本地 block 外未初始化

转载 作者:行者123 更新时间:2023-11-30 07:03:28 26 4
gpt4 key购买 nike

在下面的代码中,我在 try-catch block 之外声明了一个引用类型变量。然后我在 try block 中初始化它并尝试在 final block 中再次使用它。但是编译器警告我变量在最后一个 block 内未初始化。

据我了解,因为我已经在 try block 中初始化了 file 变量,所以它在最后一个 block 中不应该为 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 block 中初始化引用变量后,该变量将在 final block 中保持未初始化状态?


我在 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
}
}

最佳答案

问题是如果 new FileInputStream("data") 抛出异常,那么 file 变量将不会在最后一个 block 中设置。您可以通过捕获资源来解决此问题。

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

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

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

关于java - 在本地 block 内初始化的引用类型在本地 block 外未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com