java - 在 try block 内声明 RandomAccessFile 对象会发出资源泄漏警告,但在外部声明则不会?

标签 java try-catch randomaccessfile resource-leak

这是我的代码:

try {
    RandomAccessFile srcFile = new RandomAccessFile("src.txt", "rw");
} catch(FileNotFoundException e) {
    e.printStackTrace();
}

此代码向我发出警告,指出 RandomAccessFile 对象 srcFile 永远不会关闭。

但是,如果我修改代码并在 try block 之外声明 srcFile(如下面的代码所示),警告就会消失。

RandomAccessFile srcFile;
try {
    srcFile = new RandomAccessFile("src.txt", "rw");
} catch(FileNotFoundException e) {
    e.printStackTrace();
}

为什么会发生这种情况,因为我在任何情况下都没有执行 srcFile.close(); 操作?

最佳答案

摘自this :

If a resource is stored in a field, no single method is considered as responsible for closing; no problem is reported.

我认为这就是在 try 范围之外声明 srcFile 时发生的情况。这意味着 Eclipse 编译器不能假设该资源需要关闭,因为 I 可能仍然在创建的范围之外被引用。

从 JDK 1.7 开始,您可以使用 try-with-resources 解决此问题:

try (RandomAccessFile srcFile =  new RandomAccessFile("src.txt", "rw")) {
    //Do something with srcFile
} catch(IOException e) {
    e.printStackTrace();
}

请注意,srcFile将在执行try后自动关闭。

关于java - 在 try block 内声明 RandomAccessFile 对象会发出资源泄漏警告,但在外部声明则不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775874/

相关文章:

Java : write results from multiple files parsed with Jsoup to text file

java - @Reference 字段上的 Morphia 点符号查询

java - Exception 的 catch 子句中包含什么

java - 抛出异常时编译错误?

java - 捕获异常后继续执行程序

java - 如果所需长度不够长,如何用空格填充字符串?

c++ - 在随机访问文件中存储类数据的最佳实践

c++ - 从文件写入和读取数据时丢失数据(随机访问文件,C++)

java - 在哪里可以找到并安装 org.osgi.framework 包?

java - 如何对变量值进行排序,然后按从大到小的顺序打印它们?