为何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
相关产品推荐
相关产品推荐

