Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MVC DAO实现获取NullPointerException错误_Java_Model View Controller - Fatal编程技术网

Java MVC DAO实现获取NullPointerException错误

Java MVC DAO实现获取NullPointerException错误,java,model-view-controller,Java,Model View Controller,我试图学习如何使用MVC和DAO,但我的实现现在失败了,我无法回避 以下是我的观点或其相关部分: package gui; import javax.swing.JFrame; public class LoginFrame{ private JPanel contentPane; private final JLabel credentialsLabel = new JLabel("Credentials"); private JTextField usernam

我试图学习如何使用MVC和DAO,但我的实现现在失败了,我无法回避

以下是我的观点或其相关部分:

package gui;

import javax.swing.JFrame;

public class LoginFrame{

    private JPanel contentPane;
    private final JLabel credentialsLabel = new JLabel("Credentials");
    private JTextField usernameField;
    private JPasswordField passwordField;
    private JButton btnLogin;

    /**
     * Create the frame.
     */
    public LoginFrame() {
        createAndShowGUI();

    }

    private void createAndShowGUI()
    {
            EventQueue.invokeLater(new Runnable() {
            public void run() {
            try {
                    JFrame frame = new JFrame();
                    frame.setTitle("Login");
                    frame.setContentPane(createContentPane());
                    frame.setBounds(100, 100, 480, 237);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } 
        });

    }


    //A function that sets up the basic structure of the GUI.
    private JPanel createContentPane() {

        contentPane = new JPanel();
        contentPane.setForeground(Color.LIGHT_GRAY);
        contentPane.setBackground(Color.DARK_GRAY);
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        GridBagLayout gbl_contentPane = new GridBagLayout();
        gbl_contentPane.columnWidths = new int[]{106, 0, 0, 153, 0};
        gbl_contentPane.rowHeights = new int[]{65, 27, 39, 36, 0, 0};
        gbl_contentPane.columnWeights = new double[]{0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
        gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
        contentPane.setLayout(gbl_contentPane);



        //login button
        btnLogin = new JButton("login");
        GridBagConstraints gbc_btnLogin = new GridBagConstraints();
        gbc_btnLogin.anchor = GridBagConstraints.WEST;
        gbc_btnLogin.insets = new Insets(0, 0, 5, 5);
        gbc_btnLogin.gridx = 2;
        gbc_btnLogin.gridy = 3;
        contentPane.add(btnLogin, gbc_btnLogin);

        //register button 
        JButton btnRegister = new JButton("register");
        btnRegister.setFont(new Font("Helvetica", Font.PLAIN, 13));
        GridBagConstraints gbc_btnRegister = new GridBagConstraints();
        gbc_btnRegister.anchor = GridBagConstraints.WEST;
        gbc_btnRegister.insets = new Insets(0, 0, 5, 0);
        gbc_btnRegister.gridx = 3;
        gbc_btnRegister.gridy = 3;
        contentPane.add(btnRegister, gbc_btnRegister);
        return contentPane; 
    }

    //the Action Listener for the Login Button passed by controller
    public void buttonActionListeners(ActionListener al) {
        btnLogin.setActionCommand("login");
        btnLogin.addActionListener(al); 
    }


}
我的模型:

package functions;

import database.LoginDAO;

public class LoginModel {
    LoginDAO logindao; 
    public LoginModel(LoginDAO logindao){
        this.logindao = logindao;
    }

    public void attemptLogin(String username, char[] password) {
        System.out.println("Testing login attempt"); 
        logindao.attemptLogin(username, password); 
    }


}
我的控制器:

package controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import functions.LoginModel;
import gui.LoginFrame;

public class LoginControl implements ActionListener {
    LoginModel model; 
    LoginFrame view; 

    public LoginControl(LoginModel model, LoginFrame view){
        this.model = model; 
        this.view = view;

        //add action listener from control to view. 
        view.buttonActionListeners(this); 
    }

    //action performed by view
    public void actionPerformed(ActionEvent ae)
    {
        System.out.println("Testing Action Performed");
        String action = ae.getActionCommand(); 
        if(action.equals("login")){
            System.out.println("Testing Action Performed");
            model.attemptLogin(view.getUsername(),view.getPassword()); 
        }
    }
}
主要内容:

import functions.LoginModel;
import java.io.IOException;
import java.sql.SQLException;
import controller.LoginControl;
import database.LoginDAO;
import gui.LoginFrame;

public class Main {

    public static void main(String[] args) throws IOException, SQLException {
        LoginFrame frame = new LoginFrame(); 
        LoginDAO loginDao = new LoginDAO(); 
        LoginModel model = new LoginModel(loginDao);
        LoginControl controller = new LoginControl(model, frame); 
    }

}
错误:

Exception in thread "main" java.lang.NullPointerException
    at gui.LoginFrame.buttonActionListeners(LoginFrame.java:160)
    at controller.LoginControl.<init>(LoginControl.java:16)
    at Main.main(Main.java:14)
因此,从我试图理解的情况来看: view.buttonActionListeners(此);在这里的某个地方我传递了一个空值, 这是null还是视图是null? 如果我们启动,视图怎么可能为空 登录框架视图

谢谢你帮我解决这个错误

好的。。。知道了。 调用时,btnLogin属性为null

view.buttonActionListeners(this);
之所以会发生这种情况,是因为它是在一个可运行的异步系统上初始化的,可能还没有运行。 从这部分代码中,我看不出需要异步调用它。所以我建议同步设置属性。因此,它应该是:

 private void createAndShowGUI()
{

                JFrame frame = new JFrame();
                frame.setTitle("Login");
                frame.setContentPane(createContentPane());
                frame.setBounds(100, 100, 480, 237);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
}

我想你的btnLogin属性是空的,你得到这个错误。但是我还没有确定它怎么可能是空的。你是对的。现在,我需要研究何时需要在GUI上使用Runnable。
 private void createAndShowGUI()
{

                JFrame frame = new JFrame();
                frame.setTitle("Login");
                frame.setContentPane(createContentPane());
                frame.setBounds(100, 100, 480, 237);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
}