MailClient Homework

时间:2015-05-03 22:08:38

标签: java

我遇到以下问题,我想知道这里是否有人可以提供帮助。错误如下。

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();}}

很抱歉格式化,第一次使用本网站。

1 个答案:

答案 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,然后追溯到你的代码,看看为什么。你会一次又一次地碰到这些,相信我。