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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:18:00