当前位置: 首页 > 知识库问答 >
问题:

Java在尝试获取方法时返回Null

卢锋
2023-03-14

首先我知道这是一个重复的问题。但我已经搜索并尝试从谷歌上列出的stackoverflow到quora,但仍然无法解决Get方法仍然返回null的问题。

这是我的类登录模型。com包下的java。你好模型

public class loginModel {
  public String username;

  public void setUsername(String username) {
      this.username = username;
  }

  public String getUsername() {
      return this.username;
  }
}

这是我的登录视图。com包下的java。你好看法

import com.hello.model.loginModel;

public class loginView extends javax.swing.JFrame {
  loginModel login = new loginModel();

  public loginView() {
      initComponents();
      this.setLocationRelativeTo(null);
      loginFunction();
  }

  private void loginFunction(){
    String username = usernameText.getText();
    String password = passwdText.getText();
    String query = "select * from access where username = '" +username+ "' AND password = '" +password+"'";
    databaseConnect db = new databaseConnect();

    try (Connection con = DriverManager.getConnection(db.url, db.user, db.password);
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery(query)) {

        if(rs.next()) {
            if(username.equals(rs.getString("username")) && password.equals(rs.getString("password"))){
                JOptionPane.showMessageDialog(null, "login Success");
                String name = rs.getString("name");
                String privilege = rs.getString("privilege");
                login.setUsername(name);

                menu = new menuView();
                menu.setVisible(true);
                this.setVisible(false);
            }
        } else {
                JOptionPane.showMessageDialog(null, "username or password incorrect");
            }
    } catch (SQLException e) {
        System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());

    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

我想从menuView调用我的用户名。com包下的java。你好登录成功后查看

import com.hello.model.loginModel;
import com.hello.view.loginView;

public class menuView extends javax.swing.JFrame {    
  private String username;
  loginModel login = new loginModel();

  public menuView() {
    initComponents();
    this.setLocationRelativeTo(null);
    initMenu();
  }

  private void initMenu(){
    username = login.getUsername();
    JOptionPane.showMessageDialog(this, username);
  }
}

根据我在loginModel中调用Get方法时的问题,messagebox返回null。

我尝试过:

  1. 将system.out.println直接放在loginModel.java,值返回和调用system.out.println在menuView.java同时但值返回null。怎么做?
  2. 在loginView.java中使用菜单=menuView(用户名)在jframe之间发送字符串,并在menuView.java中检索,值返回null
  3. 不使用模型并在loginView中创建set字符串并在menuView中调用它,值返回null

我需要在另一个类/包/jframe中使用的值。我做错了吗?

共有3个答案

朱起运
2023-03-14

你需要分阶段/步骤思考。登录是一个单一的步骤,它有两个结果之一,成功或失败。

你的应用程序需要执行此步骤,并根据结果采取适当的措施。

您还需要考虑“责任分离”——在这种情况下,执行登录操作并不是loginView的真正责任,它只是协调用户输入。

责任实际上落在LoginModel

// Just a custom exception to make it easier to determine 
// what actually went wrong
public class LoginException extends Exception {

    public LoginException(String message) {
        super(message);
    }

}

// LoginModel ... that "does" stuff
public class LoginModel {

    private String username;
    DatabaseConnect db;

    public LoginModel(DatabaseConnect db) {
        this.db = db;
    }

    // I would consider not doing this.  You need to ask what reasons would
    // the app need this information and expose it only if there is really a 
    // reason to do so
    public String getUsername() {
        return username;
    }

    public boolean isLogedIn() {
        return username != null;
    }

    public void validate(String username, String password) throws SQLException, LoginException {

        String query = "select * from access where username = ? AND password = ?";

        try ( Connection con = DriverManager.getConnection(db.url, db.user, db.password);  PreparedStatement st = con.prepareStatement(query)) {
            st.setString(1, username);
            st.setString(2, password);

            try ( ResultSet rs = st.executeQuery()) {
                if (rs.next()) {
                    this.username = username;
                } else {
                    throw new LoginException("Invalid user credentials");
                }
            }
        }
    }

}

这是一个过于简化的例子,因为执行登录的实际责任应该落在控制器身上,控制器随后会生成模型,但我已经超越了自己。

由于应用程序的流程不应由登录视图控制/确定,LoginView本身应该是一个对话框。这样,它可以在你需要的时候显示出来,它可以执行它需要的任何操作,然后离开,剩下的决策由谁来决定

public class LoginView extends javax.swing.JDialog {

    private LoginModel model;

    public LoginView(LoginModel model) {
        initComponents();
        setModal(true);
        this.model = model;
        this.setLocationRelativeTo(null);
    }

    // This will get executed when the user taps some kind of "perform login button"
    private void loginFunction() {
        String username = usernameText.getText();
        String password = passwdText.getText();

        try {
            model.validate(username, password);
            dispose()
        } catch (SQLException ex) {
            // This should probably be considered a fatal error
            model = null;
            dispose();
        } catch (LoginException ex) {
            JOptionPane.showMessageDialog(this, "Login vaild");
        }
    }
}

这意味着你可以把它组合成这样的东西。。。

DatabaseConnect db = new DatabaseConnect();
LoginModel model = new LoginModel(db);

LoginView loginView = new LoginView(model);
// Because we're using a modal dialog, the code execution will wait here
// till the window is disposed/closed
loginView.setVisible(true);

if (loginView.model != null) {
    // model is now valid and can continue to be used
    // in what ever fashion you need
} else {
    JOptionPane.showMessageDialog(null, "Fatal Error");
}

这使您更接近于一个更解耦的解决方案,在这个解决方案中,您可以在类需要时向类提供信息,而不是让类决定应该创建/使用什么。

这也让你离可重用类更近了一步,因为它们只做特定的工作。

您可能会发现花时间阅读“模型-视图-控制器”将帮助您更好地理解这种方法

卢英范
2023-03-14

您的menuView实例没有使用您在loginView中实例化的loginModel类,它使用您在初始化menuView类中的login变量时使用new menuView()创建的新类。您只需要为menuView类中的loginModel属性添加一个setter方法,如下所示:

import com.hello.model.loginModel;
import com.hello.view.loginView;

public class menuView extends javax.swing.JFrame {    
  private String username;
  loginModel login = new loginModel();

  public menuView() {
    initComponents();
    this.setLocationRelativeTo(null);
    initMenu();
  }

  private void initMenu(){
    username = login.getUsername();
    JOptionPane.showMessageDialog(this, username);
  }

  public void setLogin(loginModel loginModel) {
    this.login = loginModel;
  }
}

然后在loginView中调用setter。登录功能如下:

... code before
 login.setUsername(name);
 menu = new menuView();
 menu.setLogin(login);
 menu.setVisible(true);
 this.setVisible(false);
... code after

请注意,对代码的唯一更改是在menuView类上添加了setLogin方法,以及在loginView.loginFunction中调用menu.setLogin(login)

雷方伟
2023-03-14

我不太精通摇摆,但我能看到问题,只是不是确切的解决方案。

您的代码在menuView和loginView中创建一个loginModel实例。然后在loginView中设置它拥有的实例中的名称,在menuView中它从自己的实例中获取名称。

您需要创建模型的单个实例并在两个视图之间共享它。

我会以pojo的方式将loginModel传递给构造函数中的两个“视图”。

menu = new menuView(login);

在菜单中查看

public menuView(loginModel login) {
    this.login = login;
}
 类似资料:
  • 我有一个返回< code>List的方法。现在我想知道如何正确放置< code>try/catch块。如果我将< code>return语句放在< code>try中,我会得到错误 并非所有代码路径都返回值 如果我放置在之后(就像我目前所做的那样),即使在之后,它也会返回。那么最好的方法应该是什么? 方法如下:

  • 我正在尝试实现一个Android应用程序,它启动一个子活动,计算我当前位置的坐标。然而,在尝试将数据发送回MainActivity时,我在onActivityResult方法中得到了一个NullPointerException。以下是两个类: } 编辑:这是我的日志 03-13 13:06:59.940 14638-14638/会面。be2015.gcm\U meetup E/AndroidRun

  • 我在Java中有一个与MySQL连接的多类项目,我可以与这个SQL数据库建立连接,但当我试图将它读入数组时,它得到的是废话,而不是所请求的信息。我做错了什么? 它在sql定义下面出现了一条弯曲的线条,说它们从来没有被读取过,但我就是不明白为什么会这样!它构建得很好,可以看到数据库中有行,但它返回以下内容: 显示“java2assignment3.dvd@5e0010bc”和“java2assign

  • 在Eclipse3.6中运行代码时,我在下面的语句中得到了一个。1: 我读过类似问题的帖子,并尝试过答案,但运气不佳,包括: 使用绝对路径 使用各种相对路径 将gif放入各种文件夹(src、bin、lib等) 创建等待灯。gif- 我当前的图像项目路径是LosOMeter- 有什么想法吗? 堆栈跟踪:

  • 我在尝试将add方法用于ArrayList时出现此错误。我可以看到很多人都有同样的问题,但他们在向arraylist添加元素之前没有初始化arraylist。但我正在尝试添加,而且,我仍然要求控制台返回消息arraylist在方法之前是否为null,并且它返回false。 系统出来println(消息==空);打印错误。我还尝试在开始时初始化messages ArrayList,而不仅仅是声明。有

  • 本文向大家介绍android getActivity.findViewById获取ListView 返回NULL的方法,包括了android getActivity.findViewById获取ListView 返回NULL的方法的使用技巧和注意事项,需要的朋友参考一下 在控件ID正确的情况下,检查是否在实例化布局文件之后,获取LISTVIEW, 先inflate找layout下布局文件,并实例化