Сканер не работает несколькими способами?
Я использовал класс Scanner в конструкторе и в другом методе, и ошибка говорит о том, что 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:`Сканер закрыт
sureOpen(Неизвестный источник)
следующий (неизвестный источник)
nextInt (неизвестный источник)
nextInt (неизвестный источник)
2 ответа
В вашем методе execute() вы закрываете сканер
scobj.close();
Затем, позже, вы делаете:
weekchoice=scobj.nextInt();
Когда сканер закрыт, вызов "nextInt()" приведет к сбою вашей программы.
Поместите "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();
}
Однажды Scanner
закрыть его внутренний входной поток System.in
также закрыто.
Следовательно, вы не можете получить к нему доступ после звонка close()
метод.
Из Javadoc:
Когда сканер закрыт, он закроет свой входной источник, если в источнике реализован интерфейс Closeable.
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
Я предлагаю вам позвонить scObj.close()
в конце вашего main()
только метод. Тогда вам больше не нужно беспокоиться об этой ошибке в других методах.