2016-11-20 62 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开始读取不建议,因为它禁止进一步键盘输入。

编辑(刚刚看到你的后续问题):垃圾收集器只释放内存。它不会清除对象所持有的其他资源(文件句柄,网络连接,锁等)。