Java 为什么不';我被警告要使用扫描仪';资源泄漏';什么时候在课堂上宣布?
当我编写这样的代码时:Java 为什么不';我被警告要使用扫描仪';资源泄漏';什么时候在课堂上宣布?,java,memory-leaks,java.util.scanner,Java,Memory Leaks,Java.util.scanner,当我编写这样的代码时: void methodName(){ Scanner sc = new Scanner(System.in); int inp = sc.nextInt(); System.out.println(inp); } class MyClass{ Scanner sc; void methodName(){ sc = new Scanner(System.in); int in
void methodName(){
Scanner sc = new Scanner(System.in);
int inp = sc.nextInt();
System.out.println(inp);
}
class MyClass{
Scanner sc;
void methodName(){
sc = new Scanner(System.in);
int inp = sc.nextInt();
System.out.println(inp);
}
}
我收到一个“资源泄漏”警告,建议我关闭扫描仪
实例。但是当我在方法之外定义sc
时,如下所示:
void methodName(){
Scanner sc = new Scanner(System.in);
int inp = sc.nextInt();
System.out.println(inp);
}
class MyClass{
Scanner sc;
void methodName(){
sc = new Scanner(System.in);
int inp = sc.nextInt();
System.out.println(inp);
}
}
我没有收到“资源泄漏”警告,为什么
另一个小问题,如果我做
sc=null
,我想扫描器
对象将有资格进行垃圾收集,因为它不再被引用,从而释放内存,对吗?所以是sc=null代码>足以解决“资源泄漏”,而无需sc.close()代码>?首先,在方法末尾,sc
不在范围内。因此,我们期望它将被关闭*
在第二个实例中,由于sc
是类级字段,因此它将保留在方法末尾的范围内。因此,我们期望它将用于其他方法,并在更合适的时间关闭
*不建议关闭扫描仪
s从系统中读取。
会禁止进一步的键盘输入
编辑(刚刚看到您的后续问题):垃圾收集器只释放内存。它也不会清理对象持有的其他资源(文件句柄、网络连接、锁等)。首先,在方法末尾,sc
不在范围内。因此,我们期望它将被关闭*
在第二个实例中,由于sc
是类级字段,因此它将保留在方法末尾的范围内。因此,我们期望它将用于其他方法,并在更合适的时间关闭
*不建议关闭扫描仪
s从系统中读取。
会禁止进一步的键盘输入
编辑(刚刚看到您的后续问题):垃圾收集器只释放内存。它也不会清理对象持有的其他资源(文件句柄、网络连接、锁等)