最近的一次实验中,在主类函数调用一次其它类的函数时,发现输入Scanner函数出问题了,报错找不到,而当我把被调用函数的对Scanner对象in的方法,in.close();注释掉时,发现主函数恢复正常了,所以我想测试一下in.close();这行代码到底close了什么。
直接贴代码了
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
Scanner in1=new Scanner(System.in);
System.out.println("in=in1 ? "+(in==in1));
Scanner filein2=null;
Scanner filein=null;
try {
filein =new Scanner(new File("test/graphpoet.txt"));
filein2=new Scanner(new File("test/graphpoet.txt"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("in=fliein?"+(in==filein));
System.out.println("filein=filein2"+(filein==filein2));
System.out.println(in.nextLine());
System.out.println(filein.nextLine());
in1.close();
System.out.println("close in1");
// System.out.println(in.nextLine());
// System.out.println(in.nextLine());
System.out.println(filein.nextLine());
filein2.close();
System.out.println("filein2 closed");
for(int i=0;i<3;i++)
System.out.println(filein.nextLine());
}
运行结果:
in=in1 ? false
in=fliein?false
filein=filein2false
123
123
GraphType = “GraphPoet”
close in1
GraphName = “LabNetwork”
filein2 closed
VertexType = “Word”
Vertex = <“Word12”, “Person”>
分析:
in=new Scanner(System.in);
in1=new Scanner(System.in);
filein=new Scanner(file1);
filein2=new Scanner(file1);
由运行结果可知:
1. in,in1,filein,filein2各自指向不同的对象
2. 当in1.close()后filein不受影响
3. 当in1.close(),再调用in.nextline()(把代码注释部分取消注释)会抛出异常,找不到该行,即in会受影响
4. 当filein2.close()后,filein不受影响;
结论:close(),方法并不是close了所有的Scanner 对象,而调用Scanner(System.in) 对象的close()方法后,再调用其它的Scanner(System.in)会抛出异常。