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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:27:04