You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多方法中Scanner无法工作?构造方法与方法创建实例仍报关闭错误

解决Scanner已关闭错误的问题

嘿,我完全懂你现在的困惑!你以为每个方法里新建Scanner对象就能避开关闭的问题,但其实这里藏着一个容易踩的坑——所有基于System.in创建的Scanner,共享的是同一个底层输入流。

问题根源

哪怕你在构造方法和另一个方法里分别new了不同的Scanner实例,只要其中任何一个Scanner调用了close()方法,就会把底层的System.in输入流也一并关闭。而System.in是全局唯一的控制台输入流,一旦关闭就无法重新打开,后续再创建新的Scanner去读取它,自然就会抛出“Scanner已关闭”的错误。

比如你构造方法里的代码如果是这样:

UserInterface() {
    System.out.println("Welcome! Which store would you like to look at?");
    Scanner scob = new Scanner(System.in);
    String store = scob.nextLine();
    scob.close(); // 这里关闭了Scanner,同时也关了System.in
    // ...其他逻辑
}

那之后在另一个方法里新建Scanner读取System.in时,就会直接报错。

两种解决方案

方案1:永远不要关闭基于System.in的Scanner

控制台程序里,System.in的生命周期和程序一致,你完全不需要主动关闭它。JVM在程序结束时会自动处理这些资源,所以只要去掉所有sc.close()的调用就行:

public class UserInterface {
    public UserInterface() {
        System.out.println("Welcome! Which store would you like to look at?");
        Scanner scob = new Scanner(System.in);
        String store = scob.nextLine();
        // 不要调用scob.close()
        // 处理输入逻辑...
    }

    public void anotherMethod() {
        Scanner anotherScob = new Scanner(System.in);
        String input = anotherScob.nextLine();
        // 同样不要调用close()
        // 处理输入逻辑...
    }
}

方案2:复用同一个全局Scanner实例

更优雅的做法是在类里定义一个全局的Scanner对象,让所有方法共享它,这样既避免了重复创建对象,也不会不小心关闭输入流:

public class UserInterface {
    // 全局共享的Scanner实例
    private final Scanner scanner = new Scanner(System.in);

    public UserInterface() {
        System.out.println("Welcome! Which store would you like to look at?");
        String store = scanner.nextLine();
        // 处理输入逻辑...
    }

    public void anotherMethod() {
        String input = scanner.nextLine();
        // 处理输入逻辑...
    }

    // 可选:如果程序有明确的结束时机,可以在这里关闭Scanner
    public void shutdown() {
        scanner.close();
    }
}

总结

核心问题不是Scanner对象的局部性,而是它们共享的System.in输入流。只要记住:要么不关闭任何基于System.in的Scanner,要么复用同一个Scanner实例,就能解决这个报错啦!

内容的提问来源于stack exchange,提问作者Maya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:49:47