提问人:Alexandra 提问时间:4/1/2023 最后编辑:Alexandra 更新时间:4/1/2023 访问量:65
如何避免空指针异常 [重复]
How to not have a null pointer exception [duplicate]
问:
当我尝试输入存款、取款、余额查询和帐户信息中的金额时,我的程序输出 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”为空
答:
-1赞
mi1000
4/1/2023
#1
在 your 的情况 0 中,您正在通过其构造函数创建一个 new,从而给他一个值,但是如果您输入其中的情况 1,则永远不会调用帐户构造函数,因为您只是这样声明它:switch
SavingsAccount
switch
public static SavingsAccount accnt;
当您初始化变量而不为其赋值时,它会获得一个默认值,即 。您无法访问对象的属性,因为它没有任何属性。在对对象使用任何方法之前,必须从某个位置调用构造函数。null
null
评论
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 的具体问题。
评论