我遇到以下问题,我想知道这里是否有人可以提供帮助。错误如下。
Exception in thread "main" java.lang.NullPointerException
at client.Contact.save(Contact.java:35)
at client.Message.save(Message.java:44)
at client.Mailbox.save(Mailbox.java:62)
at client.cmd.Save.run(Save.java:15)
at client.CmdLoop.run(CmdLoop.java:53)
at Main.main(Main.java:41)
Contact.save方法。错误出现在"联系人C =缺口..."
public void save(AddressBook nick, PrintStream print){
Contact C=nick.search(NickName);
if(C!=null)
{
print.println(NickName);
}
else
{
print.println(Email);
}
Message.save方法 - 出现错误我相信to.save和from.save
public void save(AddressBook nick, PrintStream print){
to.save(nick, print);
from.save(nick, print);
print.println(body);
print.println(subject);
print.println(date);}
最后,Mailbox.save方法 - 错误出现在" m1.save(nick,myStream)"
public void save(String fileName){
Message m1 = null;
AddressBook nick = null;
File myFile = new File(fileName);
try {
PrintStream myStream = new PrintStream(myFile);
for(int n=0; n < mailbox.size(); n++)
{
m1 = mailbox.get(n);
m1.save(nick, myStream);
}
} catch (FileNotFoundException e) {System.out.println("Mailbox unable to save to file " + myFile);
e.printStackTrace();}}
很抱歉格式化,第一次使用本网站。
答案 0 :(得分:1)
public void save(String fileName){
Message m1 = null;
AddressBook nick = null; // **** null!! ****
File myFile = new File(fileName);
try {
PrintStream myStream = new PrintStream(myFile);
for(int n=0; n < mailbox.size(); n++)
{
m1 = mailbox.get(n);
m1.save(nick, myStream); // **** nick still null! ****
}
} catch (FileNotFoundException e) {System.out.println("Mailbox unable to save to file " + myFile);
e.printStackTrace();
}
}
因此,您将空nick
传递给m1.save(...)
方法,然后想知道为什么您会收到NullPointerException。你不应该感到惊讶。
然后将该AddressBook参数传递给您的to.save(nick, print);
方法调用:
// the nick parameter is still null
public void save(AddressBook nick, PrintStream print){
to.save(nick, print); // **** and so null is passed in here
from.save(nick, print);
print.println(body);
print.println(subject);
print.println(date);
}
使用该方法,您可以在其上调用nick.search(NickName);
:
// yep, nick is still null
public void save(AddressBook nick, PrintStream print) {
// below you try to call a method off of a null reference
Contact C = nick.search(NickName); // so you get a NPE here ***
但是因为它仍然是空的,程序会抛出一个NPE,这也不应该令人惊讶。
解决方案:不要将null传递给此方法调用。
更重要的是,您需要学习如何调试NPE(NullPointerException)的一般概念。 你应该批判性地阅读你的异常堆栈跟踪以找到错误的代码行,抛出异常的行,然后仔细检查该行,找出哪个变量为null,然后追溯到你的代码,看看为什么。你会一次又一次地碰到这些,相信我。