【发布时间】:2014-06-30 13:28:35
【问题描述】:
我正在学习 Java 并从事一些有趣的项目。我遇到的一个问题是,当我使用 Scanner 对象时,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 类中关闭扫描仪并再次进入test2 中的do 循环后,test = scan.nextInt(); 行出现错误
我尝试将扫描仪对象的创建移动到 do 循环中,以便每次也创建一个新对象,但错误仍然存在。
不知道为什么会发生这种情况,也不知道如何确保关闭所有 I/O 对象而不会遇到问题。
我遇到的一篇帖子提到,当System.in 关闭时,我无法重新打开。如果是这种情况,我是否只需要确保带有 System.in 的扫描仪对象在程序的最后关闭并@suppress 其他类中的所有其他扫描仪警告?或者这仍然会使所有这些扫描仪对象保持打开状态(坏)?
【问题讨论】:
-
这里有一个很好的讨论这个问题:stackoverflow.com/questions/12519335/…
-
我相信诀窍是只允许您使用一个与 System.in 对象相关联的 Scanner 对象。因此,您需要构建代码以利用这一 Scanner 对象。
标签: java eclipse java.util.scanner