Java账户注册功能密码包含用户名的if校验不满足条件仍触发如何解决
问题根因
- 用户名校验通过后未赋值给类成员变量
username:你在getUsername方法中获取到符合规则的用户名后,仅打印了提示信息,没有将输入值赋值给类的成员变量username,导致该变量始终为构造方法中初始化的空字符串""。Java 中所有字符串调用contains("")都会返回true,因此密码包含用户名的校验分支会无条件触发。 - 输入读取逻辑存在隐患:
getUsername中使用reader.next()读取输入,该方法只会读取空格前的内容,且会在输入缓冲区残留换行符,后续getPassword中调用scanner.nextLine()会直接读取到空值,引发额外的校验错误;同时代码中重复创建了多个Scanner实例,属于不必要的资源浪费。
修复后的完整代码
import java.util.Scanner; public class Module2 { Scanner reader = new Scanner(System.in); String username; String password; public Module2() { this.username = ""; this.password = ""; } public static void main(String[] args) { System.out.println("starting application: initiating username and password creation"); Module2 m2 = new Module2(); m2.getUsername(); m2.reader.close(); } public String getUsername() { System.out.println("new username: must start with a letter and be at least 6 characters long but not more than 12 characters"); // 读取完整一行用户名输入 String input = reader.nextLine(); char firstChar = input.charAt(0); boolean isStartWithLetter = Character.isLetter(firstChar); if (!isStartWithLetter) { System.out.println("username must begin with a letter"); } else if (input.length() < 6) { System.out.println("username must be at least 6 characters long"); } else if (input.length() > 12) { System.out.println("username must not be longer than 12 characters"); } else { // 赋值给类成员变量 this.username = input; System.out.println("Thank you " + input); getPassword(); } return ""; } public String getPassword() { System.out.println("new password: must be at least 8 characters long but no more than 16 characters long and cannot contain the username"); String password = reader.nextLine(); if (password.contains(username)) { System.out.println("password cannot contain the username"); } else if (password.length() < 8) { System.out.println("password has to be at least 8 characters long"); } else if (password.length() > 16) { System.out.println("password must not contain more than 16 characters"); } else { System.out.println("Thank you\n" + password); System.out.println("username and password validated"); System.out.println("ending application"); } return ""; } }
关键修改说明
- 用户名校验通过后添加
this.username = input;,将合法输入赋值给类成员变量,保证密码校验时能拿到正确的用户名进行匹配 - 删除了方法内重复创建的Scanner实例,统一使用类成员变量的Scanner,避免资源浪费
- 将读取用户名的
next()方法改为nextLine(),避免输入缓冲区残留换行符导致密码读取异常 - 新增了Scanner资源关闭逻辑,避免资源泄露
内容的提问来源于stack exchange,提问作者kev0
相关产品推荐
相关产品推荐

