首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭多个扫描器会导致问题

关闭多个扫描器会导致问题
EN

Stack Overflow用户
提问于 2022-04-25 18:19:12
回答 3查看 96关注 0票数 0

我有一个函数正在被调用,我希望它继续循环,但是当我接受一个输入来继续运行时,我会得到以下错误:

代码语言:javascript
复制
Exception in thread "main"
java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at SticksGame.main(SticksGame.java:144)

我假设这是由于我正在使用的扫描仪,但我不知道为什么当关闭代码中的两个扫描器时,我会遇到问题。我试图删除其中一个扫描器关闭,但我的代码无限循环,并要求相同的输入。

代码语言:javascript
复制
public void begin() {
    while (this.numOfSticks > 0) {

        if (player == 1) {
            doNextTurn(this.player);
        } else if (player == 2 && !isAgainstAi) {
            doNextTurn(this.player);
        } else {
            doAiNextTurn();
        }

        if (this.numOfSticks <= 0) {
            if (this.player == 1 && isAgainstAi) {
                // AI won
                incrementHats(true);
            }
            if (this.player == 2 && isAgainstAi) {
                System.out.println("AI loses.");
                // AI loses
                incrementHats(false);
                // System.out.print("Play again (1 = yes, 0 = no)? ");
                // int pA = scanner.nextInt();
                // printHats();
            } else {
                String message = String.format("Player %s: you lose.", this.player);
                System.out.println(message);
                // printHats();
            }
            scanner.close();
            return;
        }
        this.togglePlayer();
        // printHats();
    }

}
public static void main(String[] args) {
    SticksGame game = new SticksGame();
    Scanner s = new Scanner(System.in);
    game.begin();
    while (true) {
        System.out.println("Play again (1 = yes, 0 = no)? ");
        if (s.next().equals("1")) {
            game.begin();
        } else {
            s.close();
            System.exit(1);
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2022-04-25 18:28:13

scanner方法中没有像begin()这样的东西。如果您要在main中关闭它,则不必关闭它。

票数 0
EN

Stack Overflow用户

发布于 2022-04-25 18:38:03

来自JavaDoc of Scanner.close():“如果这个扫描器还没有关闭,那么如果它的底层可读也实现了关闭接口,那么这个可读的关闭方法将被调用。”

由于System.in是一个实现Closeable接口的InputStream,关闭扫描仪也会关闭System.in流,从而影响到其他扫描仪。如果您再次尝试使用它,您将得到一个NoSuchElementException

票数 0
EN

Stack Overflow用户

发布于 2022-04-25 18:39:22

Scanner.close()将关闭扫描器本身以及任何可关闭的底层对象。而且,由于System.in是由JVM内部管理的,因此一旦关闭它,就无法重新打开它。您应该尽量避免关闭任何包装System.in的扫描器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72004038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档