我正在学习 Java 并从事一些有趣的项目。我遇到的一个问题是,当我使用Scanner
object Eclipse 警告我:
资源泄漏:“扫描”永远不会关闭。
所以,我添加了一个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
类和 do 循环test2
再次输入该行发生错误test = scan.nextInt();
我尝试将扫描仪对象的创建移到 do 循环中,以便每次都创建一个新对象,但错误仍然发生。
不知道为什么会发生这种情况,也不知道如何确保所有 I/O 对象都被关闭而不会遇到问题。
我看到的一篇文章提到,当System.in
已关闭,无法重新打开。如果是这种情况,我是否只需要确保带有 System.in 的扫描仪对象在程序的最后关闭,并 @suppress 其他类中的所有其他扫描仪警告?或者这仍然会使所有这些扫描仪对象保持打开状态(不好)?
首先,这不是内存泄漏。
其次,当您关闭流包装器时,默认实现是关闭它包装的流。这意味着,第一次关闭扫描程序(如其所写)时,您将关闭 System.in。
一般来说,如果人们想再次从 System.in 中读取数据,则希望避免关闭 System.in。解决这个问题的最佳方法取决于您的程序。
人们可以将信息从 System.in 复制到某种缓冲区中,然后扫描该缓冲区。人们可能不会关闭扫描仪,而是在其他位置重复使用它。人们甚至可以取消对扫描仪的引用以进行垃圾收集,并在 System.in 上创建多个新的扫描仪。
这些解决方案并不完全相同,有些被认为比其他解决方案好得多;但是,这一切都取决于调用程序。尝试一些,如果遇到问题,请打开一个新的 StackOverflow 问题,在其中显示代码的相关部分、问题的描述、示例输入和错误的输出(以及所需的输出)。
祝你好运。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)