【问题标题】:Pass user input from one class to another in java?在java中将用户输入从一个类传递到另一个类?
【发布时间】:2021-03-21 01:55:17
【问题描述】:

我正在创建一个简单的聊天应用程序,用户需要登录,然后它连接到一个 mysql 表,该表根据现有记录检查用户名和密码。它检索用户名结果集并将其传递到一个字符串中,然后从该字符串中对其进行检查。我希望服务器类可以访问输入,以便可以使用用户名将消息存储到数据库中。然后,服务器通过Runtime.getRuntime().exec() 打开一个充当聊天室的命令提示符窗口。我尝试了getter,但java告诉我字符串为空。 这是我声明变量的客户端类:

public class Client {
    static final String url = "jdbc path to database";
    static final String user = "myuser";
    static final String passwd = "mypassword";
    final static int ServerPort = 5000;
    static String serverAddress;
    static Scanner in;
    static PrintWriter out;
    static Scanner scan = new Scanner(System.in);
    static boolean menuloop = true;
    public static String usern;

    static int choice, choice0, choice1;

    public Client(String serverAddress) {
        this.serverAddress = serverAddress;
    }

那么这是整个Client的类方法:

public static void login() {
    boolean validate = false;
    do {
        try {
            validate = true;
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection conn = DriverManager.getConnection(url, user, passwd);
            System.out.println("Connection established");
            Scanner s = new Scanner(System.in);
            System.out.println("Enter username");
            String username = "";
            usern = s.nextLine();
            System.out.println("Enter password");
            String password = "";
            String pass = s.nextLine();
            Statement stmt = conn.createStatement();
            String SQL = "SELECT username,password FROM mytable WHERE username='" + usern + "' && password='" + pass + "'";

            ResultSet rs = stmt.executeQuery(SQL);

            while (rs.next()) {
                username = rs.getString("username");
                password = rs.getString("password");
            }

            if (usern.equals(username) && pass.equals(password)) {
                System.out.println("Successful Login!\n----");
            } else {
                System.out.println("Incorrect Username or Password\n----");
                validate = false;
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    } while (!validate);
}

我试过getter方法

    public static String getusername(){return username;}

然后在另一个类中调用 Client.getusername() 方法后,Java 告诉我该字符串为空。我的代码中有两个用户名。其中之一称为usernusern 接受用户输入,而 username 用于从数据库中检索实际用户名。如果用户输入匹配检索到的username,则登录成功。我已将usern 声明为全局变量,正如您在我的代码中看到的那样,它是public static String usern;。使用常见的 Java 数据结构(如列表和集合)不起作用。有人可以帮帮我吗?我想避免每次用户打开聊天窗口时再次询问用户名。我没有Java经验,所以请放轻松。

【问题讨论】:

  • @Octavian 我将这行代码放在一个类方法中。我应该发布整个方法吗?
  • 用户名和密码是方法 login() 的 2 个局部变量。你得到一个空值,因为你的“真实”用户名可能是一个全局变量,并且不是由 login() 加载的,
  • @Joe 这是我的“真实”用户名
  • 如果您只有一个在 login() 中定义的用户名,那么“真实”用户名就是这个用户名,并且无法从外部访问。因此你得到了一个 NULL。
  • 有两个用户名。其中之一称为usernusern 接受用户输入,而 username 用于从数据库中检索实际用户名。如果用户输入匹配检索到的username,则登录成功。我已将usern 声明为全局变量,正如您在我的代码中看到的那样,它是public static String usern;。 @Joe 如果我错过了重点,请帮助我理解。

标签: java


【解决方案1】:

我想你对静态的使用有问题。 Client 类必须首先实例化,然后才能调用其方法。但是 login() 和 getusername() 都是静态的,可以在没有实例化客户端的情况下调用它们

Client.login()

这对构造函数 Client() 毫无意义。以下代码向您展示了它是如何工作的:

    import java.util.Scanner;
    import java.io.PrintWriter;
    public class Client {
    static final String url = "jdbc path to database";
    static final String user = "myuser";
    static final String passwd = "mypassword";
    final static int ServerPort = 5000;
    static String serverAddress;
    static Scanner in;
    static PrintWriter out;
    static Scanner scan = new Scanner(System.in);
    static boolean menuloop = true;
    public static String usern;

    static int choice, choice0, choice1;

    public Client(String serverAddress) {
        this.serverAddress = serverAddress;
    }
    public static void login() {
    boolean validate = false;
    do {
        try {
            Scanner s = new Scanner(System.in);
            System.out.println("Enter username");
            String username = "Joe";
            usern = s.nextLine();
            System.out.println("Enter password");
            String password = "Joe";
            String pass = s.nextLine();
            
            if (usern.equals(username) && pass.equals(password)) {
              validate = true;
                System.out.println("Successful Login!\n----");
            } else {
                System.out.println("Incorrect Username or Password\n----");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    } while (!validate);
  }
  public static String getusername(){
     return usern;
  }
  public static void main(String... argv) {
     Client c = new Client("hello");
     c.login();
     System.out.println(c.getusername());
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多