多方法中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
相关产品推荐
相关产品推荐

