Сканер не работает несколькими способами? - PullRequest
0 голосов
/ 03 мая 2018

Я использовал класс 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 ]

0 голосов
/ 03 мая 2018

После закрытия Scanner внутренний входной поток System.in также закрывается.

Следовательно, вы не можете получить к нему доступ после вызова метода close().

От Javadoc:

Когда сканер закрыт, он закрывает свой входной источник, если источник реализует интерфейс Closeable.

https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

Я предлагаю вам вызвать scObj.close() только в конце вашего main() метода. Тогда вам больше не нужно беспокоиться об этой ошибке в других методах

0 голосов
/ 03 мая 2018

В вашем методе 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(); 
    }
...