最近学习java遇到的问题,在网上找到了一个和我遇到一样问题但是仍没有解决的描述,于是直接把问题粘贴过来了:
在声明Scanner类的对象之后,如果后面的程序只是使用了这个对象的诸如x.nextInt()方法而没有其它语句,那么Eclipse编译器会报一个warning:Resource leak xxxxx is never closed.
在网上查了一下,需要调用.close()方法来关闭。添加这句后果然就不会报这个warning了。
但是后来又发现一个问题,调用x.close()后。就再也没有办法使用Scanner类的对象了。哪怕是再次new Scanner定义也不行,编译器会报错。
这个问题在方法内部也存在,比如定义了一个方法,方法里面定义了Scanner对象x(Scanner x = new Scanner()),之后正常输入和关闭(x.nextInt()... x.close())。然后自定义的这个方法执行完毕,跳回main方法,在main方法中就不能再定义或调用任何Scanner类型的对象了,否则会报错。
如果在自定义的方法里,不写x.close(),那么跳回main方法后,就还可以使用其它Scanner类型的对象。当然这样自定义方法里就会有一个上面提到的warning。
请问这个问题的原因和终极解决办法!!
下面是我做实验的代码:
package labpackage;
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(sc.nextInt());
method1();
Scanner sc2 = new Scanner(System.in);
int i = sc2.nextInt();
System.out.println(i);
sc.close();
}
//一旦这里将sc关闭,方法执行完毕之后,会对主方法的sc产生影响
public static void method1(){
Scanner sc = new Scanner(System.in);
System.out.println(sc.nextInt());
sc.close();
System.out.println(sc.toString());
}
}