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

Java中如何关联含Scanner变量的SignUp与LogIn类实现账号密码校验

我正在实现包含用户名、密码校验的SignUp和LogIn功能,两个功能分别写在独立的Java类中。
我不清楚如何关联这两个类,希望注册时录入的用户名、密码可与登录时的输入做一致性匹配。

SignUp类代码

import java.util.*;

public class SignUp {
    Scanner input = new Scanner(System.in);
    public static String username;
    public static String password;

    public void vars(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public void usernameMethod() {
        Scanner input = new Scanner(System.in);
        System.out.println("Your Username:");
        username = input.next();
    }

    public void passMethod() {
        System.out.println("Your Password:");
        password = input.next();
    }

    public static void main(String[] args) {
        System.out.print("SIGN UP\n\n");
        SignUp Adam = new SignUp();
        Adam.vars(username, password);
        Adam.usernameMethod();
        Adam.passMethod();
        System.out.println("Signed Up Successfully!");
    }
}

LogIn类代码

import java.util.*;

public class LogIn {
    public static void main(String[] args) {

        String username2 = null;
        String password2 = null;

        Scanner input = new Scanner(System.in);
        SignUp signUp = new SignUp();

        signUp.vars(username2, password2);
        System.out.println("Your Username:");
        username2 = input.next();

        while (!username2.contentEquals(SignUp.username)) {
            System.out.print("That doesn't match our records! Try again.");
            username2 = input.next();
        }

        if (username2.contentEquals(SignUp.username)) {
            System.out.print("Your Password:");
            password2 = input.next();
            if (password2.contentEquals(SignUp.password)) {
                System.out.print("Enjoy the Game!");
            }
        }
    }
}

问题原因

你当前的实现逻辑问题出在:SignUp类的username、password是静态成员变量,仅在当前JVM进程的运行周期内有效。如果分别运行SignUp和LogIn的main方法,相当于启动了两个完全独立的JVM进程,注册生成的账号数据会随着SignUp进程结束直接销毁,LogIn进程自然无法读取到之前的注册数据。

修复方案

方案1:统一程序入口(适合本地简单测试)

不要分开运行两个main方法,新增一个统一启动类,先执行注册流程,再执行登录流程,两个类共享同一个JVM的静态变量,数据即可正常互通。
新增启动类代码:

public class AppStarter {
    public static void main(String[] args) {
        // 先触发注册
        SignUp signUp = new SignUp();
        System.out.print("SIGN UP\n\n");
        signUp.usernameMethod();
        signUp.passMethod();
        System.out.println("Signed Up Successfully!\n");

        // 再触发登录
        LogIn login = new LogIn();
        login.checkLogin();
    }
}

调整LogIn类,把登录逻辑封装为普通方法,移除自有main方法:

import java.util.*;

public class LogIn {
    public void checkLogin() {
        String inputUsername;
        String inputPassword;
        Scanner input = new Scanner(System.in);

        System.out.println("LOG IN\n");
        System.out.println("Your Username:");
        inputUsername = input.next();
        while (!inputUsername.equals(SignUp.username)) {
            System.out.print("That doesn't match our records! Try again:");
            inputUsername = input.next();
        }

        System.out.print("Your Password:");
        inputPassword = input.next();
        if (inputPassword.equals(SignUp.password)) {
            System.out.print("Enjoy the Game!");
        } else {
            System.out.print("Wrong password, login failed.");
        }
    }
}

方案2:持久化存储数据(适合正式使用场景)

如果需要关闭程序后下次打开仍能使用之前注册的账号,就把注册生成的用户名密码写入本地文件、内存数据库或者关系型数据库,登录时直接从存储介质读取数据做校验即可。

优化建议

  • 不要用静态变量存储用户敏感信息,后续如果要支持多用户注册,可以改用Map<String, String>集合存储多组账号密码
  • 全局复用一个Scanner实例即可,不需要重复创建
  • 输入密码时可以关闭控制台回显,避免密码明文泄露

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:54:05