扫描仪无法在多种方法中使用?

时间:2018-05-03 19:28:13

标签: java methods java.util.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:`扫描程序已关闭

     

ensureOpen(未知来源)

     

下一个(未知来源)

     

nextInt(未知来源)

     

nextInt(未知来源)

2 个答案:

答案 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()。那么你不必再担心其他方法中的这个错误了