【问题标题】:java.lang.IllegalStateException: Scanner closedjava.lang.IllegalStateException:扫描仪已关闭
【发布时间】:2015-03-19 02:30:55
【问题描述】:

我得到了以下代码,但是在第一个循环之后,我的调试器给出了以下错误,这很奇怪,我一直都是这样,但它不再起作用了,这很奇怪吗?! 一步步查了一下,是切换命令后才停止?

Exception in thread "main" java.lang.IllegalStateException: Scanner closed
        at java.util.Scanner.ensureOpen(Unknown Source)
        at java.util.Scanner.findWithinHorizon(Unknown Source)
        at java.util.Scanner.nextLine(Unknown Source)
        at Level.schleife(Level.java:35)
        at Crawler.main(Crawler.java:23)

public boolean schleife() {
    System.out.println("Das Spiel beginnt, bewege Dich mit der WASD Steuerung!");
    Scanner eingabeMove = new Scanner(System.in);

    tmpi = positioni;
    tmpj = positionj;
    while (true) {
        String bewegung = eingabeMove.nextLine();
        switch (bewegung) {
            case "w": {                                        // vorwärts
                tmpi += 1;
                if (actionResult()) {
                    positioni = tmpi;
                    break;
                } else {
                    return false;
                }
            }
            case "a": {                                    // links
                tmpj -= 1;
                if (actionResult()) {
                    positionj = tmpj;
                    break;
                } else {
                    return false;
                }
            }
            case "s": {                                    // rückwärts
                tmpi -= 1;
                if (actionResult()) {
                    positioni = tmpi;
                    break;
                } else {
                    return false;
                }
            }
            case "d": {                                    // rechts
                tmpj += 1;
                if (actionResult()) {
                    positionj = tmpj;
                    break;
                } else {
                    return false;
                }
            }
            default: {                                    // falsche Eingabe
                System.out.println("Falsche Eingabe!");
                continue;
            }
        }
        eingabeMove.close();
    }
}

【问题讨论】:

  • eingabeMove.close()在循环外下移3行。

标签: java string loops


【解决方案1】:

不要在while 循环结束时调用eingabeMove.close();。您正在导致扫描仪在第一个循环结束时变得无法操作。

由于循环总是以return 终止,因此在此schleife() 方法中关闭扫描程序没有意义。

你实际上不需要关闭扫描器,因为它包装了System.in,无论如何它永远不会关闭。鉴于这一事实,您可以简单地让eingabeMoveschleife() 返回时超出范围。

如果你真的想关闭Scanner,你应该将eingabeMove作为参数传递给方法,并从调用方法中关闭它。

public boolean schleife(Scanner eingabeMove) {
   // use the scanner
}

调用代码:

Scanner eingabeMove = new Scanner(System.in);
schleife(eingabeMove);
eingabeMove.close();

【讨论】:

  • 实际上应该调用它,只是在循环大括号外向下 1 行
  • @ControlAltDel 谢谢,在他进行编辑以包含整个方法后,我发现了这一点
  • 实际上,如果您将close 移到while 循环之外,它将永远不会被调用,因为离开循环的唯一方法是通过一个return 语句。
  • @Eran 哈哈好点。所以如果他想关闭Scanner,就需要重构代码,让调用方法实例化Scanner,并传入这个。
  • gknicker 我不能使用调用方法,因为schleife 是在我的main 方法中在另一个类中启动的,而方法schleife 是在第二类中定义的...... 2 行down, right 不可达并且 1 也不能正常工作:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多