gpt4 book ai didi

Java——关闭扫描器和资源泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:58:34 26 4
gpt4 key购买 nike

我正在学习 Java 并从事一些有趣的项目。我遇到的一个问题是,当我使用 Scanner 对象时,Eclipse 警告我:

Resource Leak: 'scan' is never closed.

因此,我在代码末尾添加了一个 scan.close(); 来处理警告。

问题出现是因为我在同一个包中有其他类也使用扫描仪对象,并且 Eclipse 告诉我分别关闭这些类中的扫描仪。但是,当我这样做时,它似乎关闭了所有扫描仪对象,并且在运行时出现错误。

这是导致错误的示例:

import java.util.Scanner;
public class test2 {
public static void main(String [] args) {
Scanner scan = new Scanner(System.in);
int test = 0;
do {
//Do stuff
test = scan.nextInt();
System.out.println(test);

scanTest scanTest = new scanTest();
scanTest.test();
} while (test != 0);

scan.close();
}
}

import java.util.Scanner;
public class scanTest {
public void test() {
Scanner scanner = new Scanner(System.in);
int blah = scanner.nextInt();
System.out.println(blah);
scanner.close();
}
}

scanTest 类中关闭扫描器并再次进入 test2 中的 do 循环后,在 test = scan.nextInt() 行发生错误;

我尝试将扫描仪对象的创建移动到 do 循环中,只是为了每次都创建一个新对象,但错误仍然存​​在。

不确定为什么会发生这种情况,也不知道如何确保我的所有 I/O 对象都已关闭而不会出现问题。

我遇到的一篇帖子提到,当 System.in 关闭时,我无法重新打开。如果是这种情况,我是否只需要确保在程序的最后关闭带有 System.in 的扫描仪对象并@suppress 其他类中的所有其他扫描仪警告?或者这仍然会使所有这些扫描仪对象保持打开状态(坏)吗?

最佳答案

首先,这不是内存泄漏。

其次,当您关闭流包装器时,默认实现是关闭它包装的流。这意味着当你第一次关闭你的扫描仪时(正如它所写的那样),是的,你关闭了 System.in。

一般来说,如果他们打算再次从 System.in 中读取,则希望避免关闭 System.in。解决此问题的最佳方法取决于您的程序。

可以将信息从 System.in 复制到某种缓冲区,然后扫描缓冲区。人们可能不会关闭扫描仪,而是在其他位置重复使用它。甚至可以取消对扫描器的引用以进行垃圾收集,并在 System.in 上创建多个新的扫描器。

这些解决方案并不完全等同,有些被认为比其他的要好得多;但是,这完全取决于调用程序。尝试一些,如果遇到问题,打开一个新的 StackOverflow 问题,在其中显示代码的相关部分、问题描述、示例输入和错误输出(以及所需的输出)。

祝你好运。

关于Java——关闭扫描器和资源泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23621668/

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