Java 简单用户身份验证if语句未输出预期结果
问题核心原因
认证失败完全是Scanner类的读取方法使用不当导致的,具体错误逻辑如下:
Scanner的next()方法有固定读取规则:读取字符串时会自动跳过前置所有空白符(空格、制表符、换行),从第一个非空白字符开始读取,直到遇到下一个空白符就立刻停止,无法读取包含空格的完整字符串内容。- 你输入的用户名
john smith包含空格,执行userNameInput = userInput.next().toLowerCase()时,实际只会读到第一个空格前的john,完全丢失后半段的smith内容。 - 更严重的是,读取用户名后输入缓冲区会残留
smith\n内容,后续读取用户ID的next()方法会自动跳过开头的空格,直接读到残留的smith,根本拿不到你输入的12345用户ID。 - 最终对比环节,拿到的用户名(
john)和预定义的正确用户名(john smith)不匹配,拿到的用户ID(smith)和预定义的正确ID(12345)也不匹配,直接触发认证失败分支。
修复方案
把读取用户输入的next()方法替换为nextLine()即可解决问题。nextLine()会读取整行输入直到遇到换行符,能完整获取带空格的字符串内容。
你可以对userDetails方法做如下修改:
public void userDetails(){ Scanner userInput = new Scanner(System.in); System.out.println("Please enter user name:"); // 替换next()为nextLine(),增加trim()过滤用户误输入的前后空格 userNameInput = userInput.nextLine().trim().toLowerCase(); System.out.println("Please enter user ID:"); userIDInput = userInput.nextLine().trim(); if(userNameInput.equals(userName) && userIDInput.equals(userID)){ System.out.println("Authentication successful"); } else{ System.out.println("Authentication failed!!"); } }
注意:如果后续需要在代码中混用
next()(比如读取数字、不带空格的短字符串)和nextLine(),需要手动处理next()读取后残留在缓冲区的换行符,否则nextLine()会读到空字符串导致读取错位。
内容的提问来源于stack exchange,提问作者PiledriverWaltz
相关产品推荐
相关产品推荐

