2016-11-20 52 views
1

當我寫了這樣的代碼:爲什麼我在Class中聲明時不會對Scanner'Resource Leak'發出警告?

void methodName(){ 
     Scanner sc = new Scanner(System.in); 
     int inp = sc.nextInt(); 
     System.out.println(inp); 
} 

我收到了「資源泄漏」的警告,這表明我應該關閉Scanner實例。但是,當我定義sc的方法外,像這樣:

class MyClass{ 
    Scanner sc; 

    void methodName(){ 
     sc = new Scanner(System.in); 
     int inp = sc.nextInt(); 
     System.out.println(inp); 
    } 
} 

我沒有得到一個「資源泄漏」的警告,爲什麼?

另一個小問題,如果我做sc = null;,我想Scanner對象將有資格獲得垃圾收集,因爲它不再被引用,從而釋放內存,對吧?那麼sc = null;就足以解決'資源泄漏'沒有sc.close();

回答

0

第一種情況下,sc在方法結束時超出範圍。因此期望它會被關閉*。

在第二種情況下,因爲sc是一個類級別的字段,它將保留在方法末尾的範圍內。因此期望它將用於其他方法,並將在更合適的時間關閉。

*關閉ScannerSystem.in開始讀取不建議,因爲它禁止進一步鍵盤輸入。

編輯(剛剛看到你的後續問題):垃圾收集器只釋放內存。它不會清除對象所持有的其他資源(文件句柄,網絡連接,鎖等)。

相關問題