0

因此,在制作 ATM 系统的过程中,我必须询问用户是否希望创建一个新帐户。这意味着 ATM 的名称(位于顶部)必须从“登录”更改为“帐户创建”或类似名称。所以在按钮上按下JLabel 标题的文本需要改变。问题是,当我按下按钮 new account 时,所发生的只是终端窗口弹出,在以下行指示 NullPointerException:

title.setText("Create New Account");

据我记得,这意味着对象“title”为空。问题是它不应该为空,我绝对确定我建立了它,我想不出为什么它突然为我返回这样的错误。

以下是相关代码:

public class AccountSystem extends JFrame implements ActionListener
{
    public static Account currentuser = new Account(); //This is so that the methods know which account is currently logged in so they can perform operations on it.
    public static int count=0;
    public static Account acc[] = new Account[1000];
    public static String parts[] = new String[3];
    private JButton login, logout, createacc, deposit1, deposit2, withdraw1, withdraw2, transfer1, transfer2, nevermind;
    private JPanel optionson, optionsoff, loginarea, mainarea, titlecard, depositscreen, withdrawscreen, transferscreen, newaccountscreen;
    private JTextField username, password, transfer, depositarea, withdrawarea, retypearea;
    private JLabel userprompt, depositprompt, withdrawpromt, balancedisp, passwordprompt, mainmessage, title;
    private String newuser, newpass, newpassconfirm;
    BorderLayout borderlayout;
    GridLayout gridlayout;
    public AccountSystem()
    {
        borderlayout = new BorderLayout();
        borderlayout.setHgap(5);
        borderlayout.setVgap(5);
        //Establishing our buttons here.
        JButton login = new JButton("Login");
        login.addActionListener(this);
        JButton createacc = new JButton("New Account");
        createacc.addActionListener(this);
        JButton withdraw2 = new JButton("Withdraw");
        JButton transfer2 = new JButton("Transfer");
        //Establishing our panels here.
        JPanel optionson = new JPanel();
        JPanel optionsoff = new JPanel();
        JPanel loginarea = new JPanel();
        JPanel titlecard = new JPanel();
        //Establishing our JLabel here.
        JLabel userprompt = new JLabel("Username: ");
        JLabel passwordprompt = new JLabel("Password: ");
        JLabel title = new JLabel("LOGIN");
        //Establishing our textfields here.
        JTextField username = new JTextField(20);
        JTextField password = new JTextField(20);
        JTextField transfer = new JTextField(20);
        JTextField withdrawarea = new JTextField(20);
        mainscreen(getContentPane());
        //Building the GUI here.
        titlecard.setSize(500,50);
        titlecard.setLocation (0,0);
        loginarea.setSize(300,450);
        loginarea.setLocation(0,50);
        optionsoff.setSize(150,450);
        optionsoff.setLocation(300,50);
        titlecard.add(title);
        loginarea.add(userprompt);
        loginarea.add(username);
        loginarea.add(passwordprompt);
        loginarea.add(password);
        loginarea.add(login);
        loginarea.add(createacc);
        getContentPane().setLayout(null);
        getContentPane().add(titlecard);
        getContentPane().add(loginarea);
        getContentPane().add(optionsoff);
    }


public void actionPerformed (ActionEvent e) 
{
    if ((e.getActionCommand()).equals("Login"))
    {
        login();
    }
    else if ((e.getActionCommand()).equals("New Account"))
    {
        title.setText("Create New Account");
    }
}
4

2 回答 2

2

您将 title 变量定义为类变量:

private JLabel userprompt, ....,  title;

并作为局部变量:

JLabel title = new JLabel("LOGIN");

title.setText() 方法是访问为空的类变量。改变:

//JLabel title = new JLabel("LOGIN");    
title = new JLabel("LOGIN");

您需要对所有要视为类变量的变量执行此操作。

于 2013-05-05T21:57:40.153 回答
0

即使您已将 声明JLabel title为实例变量,您仍在构造函数的本地范围内创建新的 JLabel 标题(请记住,它们是两个不同的实体):

JLabel title = new JLabel("LOGIN");

当调用事件处理程序(actionPerformed 方法)时,您实际上是在访问 ivar。

哪个(如果你还记得的话)从未被分配过。

因此,您可以采用以下两种选择之一:

要么实例化实际的 ivar 标题

title = new JLabel("LOGIN");

或者将本地标题变量的引用设置为 ivar 标题。

JLabel title = new JLabel("LOGIN");
this.title = title;
于 2013-05-05T22:08:19.840 回答