我在构造函数和另一种方法中使用了Scanner类,错误说扫描程序已关闭,但我在每个类中创建了两个不同的扫描程序对象。我意识到在方法完成执行后会删除局部变量(即使在构造函数完成之前调用了execute)但是我认为在每个方法中创建一个对象应该处理它吗?
UserInterface() {
System.out.println("Welcome! Which store would you like to look at?");
Scanner scobj=new Scanner(System.in);
storechoice=scobj.nextInt();
printmenu();
execute();
//scobj.close();
}
public void execute() {
Scanner scobj=new Scanner(System.in);
String option1;
int weekchoice;
option1=scobj.nextLine();
scobj.close();
switch(option1) {
case "a":
System.out.println("Which week?(0-4)");
weekchoice=scobj.nextInt();
f1.getStores(storechoice).totalsalesforweek(weekchoice);
break;
default:
System.out.println("I'm sorry you must choose a-g or q to quit");
break;
}
}
我收到这些错误
IllegalStateException:`扫描程序已关闭
ensureOpen(未知来源)
下一个(未知来源)
nextInt(未知来源)
nextInt(未知来源)
答案 0 :(得分:0)
在你的"执行()"方法,关闭扫描仪
scobj.close();
然后,你做:
weekchoice=scobj.nextInt();
扫描仪关闭,调用" nextInt()"在它上面会使你的程序崩溃。
put" scobj.close();"在您方法的结束或您使用它的任何地方。
它最终会像:
public void execute()
{
Scanner scobj=new Scanner(System.in);
String option1;
int weekchoice;
option1=scobj.nextLine();
switch(option1)
{
case "a":
System.out.println("Which week?(0-4)");
weekchoice=scobj.nextInt();
f1.getStores(storechoice).totalsalesforweek(weekchoice);
break;
default:
System.out.println("I'm sorry you must choose a-g or q to quit");
break;
}
scobj.close();
}
答案 1 :(得分:0)
关闭Scanner
后,其内部输入流System.in
也会关闭。
因此,在您调用close()
方法后,您将无法再访问它。
来自javadoc:
当扫描仪关闭时,如果源实现了Closeable接口,它将关闭其输入源。
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
我建议您仅在scObj.close()
方法结束时致电main()
。那么你不必再担心其他方法中的这个错误了