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

为何Scanner.nextLine()在第二次、第三次循环时无法正常执行?

Scanner循环中nextLine()仅首次正常读取的修复方案

你的问题出在Scanner的nextInt()和nextLine()混合使用的特性上:

  • nextInt()只会读取输入的整数部分,不会处理输入末尾的换行符(就是你输入数字后按的回车)。
  • 第一次循环结束后,输入缓冲区里残留的换行符会被下一次循环的nextLine()直接读取,导致passInput变成空字符串,看起来像是跳过了密码输入步骤。

修复方法有两种:

方法1:每次调用nextInt()后,额外调用nextLine()吃掉换行符

在读取数字后,加一行代码清理缓冲区的换行:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        boolean success = false;
        for(int i = 0; i < 3; i++){
            String passInput;
            int numInput;
            System.out.print("Enter password: ");
            passInput = sc.nextLine();
            if(passInput.equals("quit")){
                System.out.println("Access denied.");
                success = true;
                break;
            }
            System.out.println(passInput);
            System.out.print("Enter number: ");
            numInput = sc.nextInt();
            sc.nextLine(); // 新增这行,吃掉数字后的换行符
            if(passInput.equals("bluedevils") && numInput == 2023){
                System.out.println("Access granted.");
                success = true;
                break;
            }else{
                System.out.println("Wrong credentials.");
            }
        }
        if(!success){
            System.out.println("Access denied.");
        }
    }
}

方法2:统一用nextLine()读取所有输入,再转换数字类型

这种方法避免混合使用不同的Scanner读取方法,更不容易出问题:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        boolean success = false;
        for(int i = 0; i < 3; i++){
            String passInput;
            int numInput;
            System.out.print("Enter password: ");
            passInput = sc.nextLine();
            if(passInput.equals("quit")){
                System.out.println("Access denied.");
                success = true;
                break;
            }
            System.out.println(passInput);
            System.out.print("Enter number: ");
            // 先读取整行,再转成整数
            String numStr = sc.nextLine();
            numInput = Integer.parseInt(numStr);
            if(passInput.equals("bluedevils") && numInput == 2023){
                System.out.println("Access granted.");
                success = true;
                break;
            }else{
                System.out.println("Wrong credentials.");
            }
        }
        if(!success){
            System.out.println("Access denied.");
        }
    }
}

两种方法都能解决你的问题,推荐用方法2,因为后续如果有更多输入类型,统一用nextLine()处理会更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:42:27