Java程序未显式设置循环却出现输入输出无限循环问题求助
问题原因及修复方案
核心原因1:do-while循环逻辑错误
doMenu方法中,用户选择值selection的读取逻辑写在了do-while循环外部,循环内部没有更新selection的取值。你第一次输入选择1之后,selection的值会一直保持为1,循环判断条件selection!=0永远成立,程序会无限重复执行case 1的dologin()方法,因此会反复打印登录名输入提示。
核心原因2:Scanner实例使用不规范
System.in是JVM全局的输入流,你在doMenu和dologin中分别创建了两个独立的Scanner操作同一个输入流,且dologin执行结束时调用了sc.close(),该操作会直接关闭底层的System.in流,导致doMenu中的Scanner后续无法正常读取输入,甚至会抛出读取异常,进一步加重重复输出的问题。
额外逻辑问题
- 字符串内容比较不能用
==,Java中==判断的是对象内存地址,字符串内容对比需要使用equals()方法,现有逻辑即使用户输入了正确的用户名,也大概率会判断为登录失败。 - 登录判断的for循环中,没有匹配就输出失败提示,会导致匹配到列表中靠后的用户时,前面的不匹配项也会输出失败提示;且匹配到用户后没有跳出循环,会做不必要的遍历。
修复方案
1. 调整doMenu循环逻辑
将菜单打印、选择值读取的逻辑挪到循环内部,每次循环都重新获取用户选择:
public void doMenu() { Scanner sc = new Scanner( System.in ); int selection; do { System.out.println(menu); System.out.println("Please enter a selection number: "); selection = sc.nextInt(); switch (selection) { case 0: //writeFile(); break; case 1: dologin(sc); break; case 2: newEmployee(); break; case 3: listEmployees(); break; case 4: changeEmployee(); break; case 5: terminateEmployee(); break; case 6: payEmployees(); break; default: System.out.println("Invalid entry, try again."); } }while(selection!=0); sc.close(); }
2. 复用Scanner实例,调整登录逻辑
private void dologin(Scanner sc) { int count = employeeList.size(); loggedIn = false; System.out.println("Please enter your login name: "); currentUser = sc.next(); for (int i=0; i < count; ++i) { if(currentUser.equals(employeeList.get(i).getLogin())) { currentID = employeeList.get(i).getID() ; System.out.println("Welcome! You are logged in!"); loggedIn = true; break; } } if(!loggedIn) { System.out.println("Log in not found. Redirecting to the main menu."); } }
内容的提问来源于stack exchange,提问作者mak95
相关产品推荐
相关产品推荐

