Сканер не работает несколькими способами?

Я использовал класс 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() только метод. Тогда вам больше не нужно беспокоиться об этой ошибке в других методах.

Другие вопросы по тегам