Java 当扫描器是静态类变量时,Eclipse显示没有资源泄漏-为什么?

Java 当扫描器是静态类变量时,Eclipse显示没有资源泄漏-为什么?,java,eclipse,garbage-collection,Java,Eclipse,Garbage Collection,假设我使用Scanner作为静态类级变量: 公共类演示{ 专用静态扫描仪=新扫描仪(System.in); 公共静态void main(字符串[]args){ int a=scanner.nextInt(); } } 我知道无论何时打开Scanner类或使用try with resources关闭Scanner类都是一个很好的做法,但显然我的Eclipse并没有指出如果它是一个静态字段,就应该关闭它。如果我将它作为局部变量放入一个方法中,那么Eclipse会自动给我一个警告,提醒我应该关闭扫描

假设我使用Scanner作为静态类级变量:

公共类演示{
专用静态扫描仪=新扫描仪(System.in);
公共静态void main(字符串[]args){
int a=scanner.nextInt();
}
}
我知道无论何时打开Scanner类或使用try with resources关闭Scanner类都是一个很好的做法,但显然我的Eclipse并没有指出如果它是一个静态字段,就应该关闭它。如果我将它作为局部变量放入一个方法中,那么Eclipse会自动给我一个警告,提醒我应该关闭扫描仪以避免资源泄漏

我知道,当类被加载时,GC不会删除任何字段,但无论如何它都不能删除Scanner,是吗


所以我的问题是:Eclipse是否有一个特定的原因,它没有表明如果它是一个类变量,我可以关闭一个扫描程序,或者它只是IDE的一个错误?你觉得怎么样?

我可以想象它就像显式类型转换一样,开发人员知道他在做什么,后台验证无法检查是否需要关闭扫描仪,或者是否需要在特定时间点取消引用扫描仪,因为字段是静态的


但是,验证可以做什么来验证您在当前范围内声明(以及需要关闭的)的所有资源是否确实已关闭。此外,
try with resources
构造只适用于JLS中提到的局部变量。

因为它永远不会超出范围;另外,
System.in
是一个全局变量。在中关闭扫描程序包装系统是一个坏主意。似乎它与任何类型的InputStream实现的工作方式相同:静态最终扫描程序扫描程序=新扫描程序(新的ByteArrayInputStream(新的字节[]{}));-->它产生同样的结果。无论如何,我觉得不关闭一个全局的类级变量是有意义的,我只是想可能有一个我不知道的更具体的答案;所以eclipse为什么不警告您是有道理的。