如何避免空指针异常 [重复]

How to not have a null pointer exception [duplicate]

提问人:Alexandra 提问时间:4/1/2023 最后编辑:Alexandra 更新时间:4/1/2023 访问量:65

问:

当我尝试输入存款、取款、余额查询和帐户信息中的金额时,我的程序输出 null,当我尝试选择我已经有一个帐户时,如果我想要创建一个新帐户,则运行平稳。

public class BankAtm {

    public static SavingsAccount accnt;
    
    public static void main(String[] args) {
        JTextField name = new JTextField();
        JTextField pin = new JTextField();
        JTextField aage = new JTextField();
        JTextField contactNo = new JTextField();
        
        String aNo;
        String aName;
        String aPin;
        int age;
        String aContactNo;
        
        String[] choices = {"Yes", "I already have an account", "Exit"};
        
        int y = JOptionPane.showOptionDialog(null, "Would you like to open a new acount?" , 
                "Bank ATM", 
                JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, choices, choices[0]);
        
        switch (y) {
        case 0:
            int max = 500;
            int min = 100;
                            
            Object[] a = {"Account Name: ", name, "Age: ", aage, "Account Pin Number: ", pin, "Contact Number (please input parent's or guardian's contact number if below 18): ", contactNo};
                                
            JOptionPane op= new JOptionPane(a, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, null);
            JDialog dialog= op.createDialog(null, "Create New Account");
            dialog.setVisible(true);
                                    
            aName = name.getText();             
            age = Integer.parseInt(aage.getText());
            aPin = pin.getText();
            aContactNo=contactNo.getText();
                        
            int no = (int) (Math.random()*(max-min+1)+max);         
            JOptionPane.showMessageDialog(null, "Your account number is "+no);
            aNo = Integer.toString(no);
            
            accnt = new SavingsAccount (aName, aNo, aPin);
            accnt.accntName=aName;
            accnt.accntNo= aNo;
            accnt.accntAge= age;
            accnt.accntPin= aPin;
            accnt.accntContactNo=aContactNo;
            
        case 1:
            int trans;
            String php;
            double amt;
            
                do {
                    
                    String s = JOptionPane.showInputDialog("1. Deposit"
                            + "\n2. Withdraw"
                            + "\n3. Balance Inquiry"
                            + "\n4. Display Account Info"
                            + "\n5. Exit");
                    trans = Integer.parseInt(s);
                    
                    switch (trans) {
                        case 1:
                            php = JOptionPane.showInputDialog("Enter amount to deposit: ");
                            amt = Double.parseDouble(php);
                            accnt.deposit(amt);
                            
                            break;
                        
                        case 2:
                            php = JOptionPane.showInputDialog("Enter amount to withdraw: ");
                            amt = Double.parseDouble(php);
                            accnt.withdraw(amt);
                            
                            break;
                        
                        case 3:
                            accnt.balInquiry();
                            
                            break;
                        
                        case 4:
                            accnt.displayAccntInfo();
                            
                            break;
                        
                        case 5:
                            JOptionPane.showMessageDialog(null, "Thank you for using our service!~");
                            
                            break;
                
                    }
            
                
                
                } while (trans!=5);
            

            }
        
    return;
    }
}

程序在线程“main”java.lang.NullPointerException中输出异常:无法调用“SavingsAccount.displayAccntInfo()”,因为“BankAtm.accnt”为空

java swing nullpointerexception joptionpane

评论

3赞 Sören 4/1/2023
这回答了你的问题吗?什么是 NullPointerException,如何修复它?
0赞 Gilbert Le Blanc 4/2/2023
将整体式主方法代码分解为方法将是一个很好的开始。方法可以单独和独立地进行测试。

答:

-1赞 mi1000 4/1/2023 #1

在 your 的情况 0 中,您正在通过其构造函数创建一个 new,从而给他一个值,但是如果您输入其中的情况 1,则永远不会调用帐户构造函数,因为您只是这样声明它:switchSavingsAccountswitch

    public static SavingsAccount accnt;

当您初始化变量而不为其赋值时,它会获得一个默认值,即 。您无法访问对象的属性,因为它没有任何属性。在对对象使用任何方法之前,必须从某个位置调用构造函数。nullnull

评论

1赞 Sören 4/2/2023
请不要回答明显的重复。相反,将它们标记为重复项,以便可以适当地关闭它们。
0赞 mi1000 4/2/2023
这正是我不喜欢那个网站的氛围的原因,只是帮助新人而不是不受欢迎怎么样?
1赞 Sören 4/2/2023
指向现有答案怎么会不受欢迎?
1赞 Sören 4/2/2023
这是将苹果与橙子进行比较。更好的比较是“你的问题已经有答案了!你所要做的就是阅读它。很酷,对吧?
2赞 rzwitserloot 4/2/2023
@Sören通用的“嘿,你去吧,这解释了NPE”在这里并不合适;显然,OP 代码的主要问题涉及理解自己的代码流或 JOptionPane 返回的内容(应使用常量)的问题。至少可以为它提出客观的理由。在这里,你告诉那些试图提供帮助的人,他们做错了。我同意;你被不必要地苛刻了,这是非常不受欢迎的。这个答案不是很好,原因不同:它实际上只是解释了 NPE 部分,也没有深入研究 OP 的具体问题。