Handler类控制台读取实现异常:menuSwitch方法无法打印变量s
让我帮你梳理下代码里的几个关键问题,这些就是导致程序异常的核心原因:
1. Scanner关闭直接终止了标准输入流
在gui.java的readConsole方法中,你读取完输入后调用了in.close()——这会直接关闭System.in标准输入流。一旦关闭,后续任何尝试读取控制台输入的操作都会彻底失效(要么抛出NoSuchElementException,要么陷入无响应的假死状态)。
举个例子:当你输入长度为1的内容(比如1),程序会进入menuSwitch方法,再次调用handler.requestReadConsole(),此时gui.readConsole()里的in.nextLine()已经无法从关闭的流中获取数据,导致程序卡住,自然也就无法输出变量s。
修复方案:移除in.close()调用。因为Scanner关联的是System.in时,完全不需要手动关闭(JVM会在程序结束时自动处理),手动关闭反而会破坏后续的输入能力。修改后的代码:
public String readConsole () { String input = null; System.out.println("entered readconsole gui"); input = in.nextLine(); System.out.println("input = " + input); // 删掉这一行:in.close(); return input; }
2. 静态变量初始化导致的流程闭环问题
你的main方法是空的,但main类里定义了静态变量handler handler = new handler();——JVM加载main类时会自动初始化这个静态变量,触发handler的构造函数,进而链式触发gui的初始化和一系列方法调用。
当输入长度为1的内容时,sortInput会调用main.menuSwitch,而menuSwitch又会再次调用handler.requestReadConsole(),形成了一个循环读取的逻辑,导致程序不断要求用户输入,看起来像是“持续允许输入但无输出”。
如果这不是你想要的逻辑,建议调整启动方式:让main方法主动启动程序,而非依赖静态变量的自动初始化。修改main.java:
public class main { // 移除静态handler变量 public static void main(String[] args) { // 手动初始化handler,控制启动时机 handler handler = new handler(); } public static void menuSwitch(String input) { System.out.println("entered menu switch with input " +input); handler handler = new handler(); String s = handler.requestReadConsole(); System.out.println(s); } }
3. 小细节:Java类名规范
Java类名需要遵循大驼峰命名法,建议把main改为Main、handler改为Handler、gui改为Gui,这是通用的编码规范,能让代码更易读和维护。
修复后预期流程
调整后程序会按预期运行:
- 启动后打印主菜单
- 读取用户输入
- 若输入长度为1,进入
menuSwitch,再次读取输入并打印结果 - 若输入长度大于1,存储到
inputvariable并打印
这样menuSwitch里的System.out.println(s);就能正常输出读取到的内容了。
内容的提问来源于stack exchange,提问作者user2910569

