我正在學習Java並在某些項目上工作以獲得樂趣。我在已經運行的一個問題是,當我使用Scanner
對象的Eclipse警告我說:Java - 關閉掃描程序和資源泄漏
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的掃描器對象,並在其他類中禁止所有其他掃描器警告。或者仍然會讓所有這些掃描儀對象打開(壞)?
這裏有一個很好的討論這個問題:http://stackoverflow.com/questions/12519335/resource-leak-in-is-never-closed – azurefrog
我相信的訣竅是,你只允許一個掃描儀對象綁定到System.in對象中。因此,您需要構建代碼以利用這一個Scanner對象。 –