2011-05-01 168 views
1

當試圖添加人員時,它只會在personList.AddPersonSort處表示空指針錯誤。請幫忙。Java - 通過文本UI將人員添加到鏈接列表

import java.util.*; 

    /** 
    *en meny 
    * @author Henning 
    */ 

    public class Menutext 
    { 

    private PersonList personList; 

    /** 
    * mainMenu() 
    * skriver ut hovedmeny 
    * @param none 
    * @return none 
    */ 
    public void mainMenu() 
    { 
     System.out.println("*********************************"); 
     System.out.println(" Main Menu"); 
     System.out.println(""); 
     System.out.println(" 1: Add a person"); 
     System.out.println(" 2: Print all the persons"); 
     System.out.println(" 3: End Program"); 
     System.out.println(" Please choose an option! "); 
    }  

    public void question() 
    { System.out.println("Would you like to proceed or quit?"); 
     System.out.println("To proceed enter 9."); 
     System.out.println("If you wish to quit enter 0."); 
     Scanner sc = new Scanner(System.in); 
     switch (sc.nextInt()) 
     {  
      case 0:  
      System.out.println ("Thank you and godbye."); 
      break;  
      case 9:  
      System.out.println ("Please proceed."); 
      new Menutext(); 
      break; 
      default: 
      System.err.println ("Unrecognized option"); 
      break; 
     } 
    } 


    /** 
    * Menu() 
    * Starter systemet. Dette will skrive ut en velkomst beskjed og starte 
    * en dialog med brukeren via en meny inntil brukeren avslutter dialogen 
    * @param none 
    * @return none 
    */ 
    public Menutext() 
    { 

     Scanner sc = new Scanner (System.in); 

     mainMenu(); 
      switch (sc.nextInt()) 
      { 
       case 1: 
        newPersonMenu(); 
        //question(); 
        break; 

       case 2: 
        System.out.println("All the people in the list:\n"); 
        personList.toString(); 
        question(); 
        break; 



       default: 
       System.out.println ("Unrecognized option"); 
       question(); 
       break; 
      } 


    } 

    /** 
    * newPersonMenu() 
    * legger til en person 
    * @param none 
    * @return none 
    */ 
    public void newPersonMenu() 
    { 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Please register a new person"); 
     System.out.print(" Please write firstname: "); 
     String fn = sc.nextLine(); 

     System.out.print(" Please write surname: "); 
     String sn = sc.nextLine(); 

     System.out.print(" Please write birthyear: "); 
     int bir = sc.nextInt(); 

     System.out.print(" Please write deathyear (or 0 if still alive): "); 
     int det = sc.nextInt(); 

     //System.out.print(" You entered: " fn + " " + sn " (" + bir + "-" + det + ")."); 

     personList.addPersonSort(fn, sn, bir, det); 


     question(); 
    } 



    public class PersonList extends DNodeList<Person> 
    { 


    /** 
    * Constructor for objects of class LinkedListEvents 
    */ 
    public PersonList() 
    { 
     super(); 
    } 

    /** 
    * lager en string representasjon av listen 
    */ 

    @Override 
    public String toString() 
    { 
     String listPerson = ""; 
     if (!isEmpty()) 
     { 
      listPerson = "Persons:\n"; 
      DNode<Person> hRef = header.getNext(); 
      while (hRef != trailer) 
      { 
       listPerson += hRef.getIndex() + " " + hRef.getElement().getFirstName() + " " + hRef.getElement().getSurname() + "(" + hRef.getElement().getbirthyear() + " - " + hRef.getElement().getdeathyear() + ")"; 
       hRef = hRef.getNext(); 
       if (hRef != trailer) 
       { 
        listPerson += "\n"; 
       } 
      } 
     } 
     else 
     { 
      listPerson = "No people registered."; 
     } 
     return listPerson; 
    } 




    /** 
    * legger til en person etter fødsels år 
    * 
    * @param fn fornavn 
    * @param sn etternavn 
    * @param bir fødselsår 
    * @param det året personen døde 
    */ 
    public void addPersonSort(String fn, String sn, int bir, int det) 
    { 
     DNode<Person> hRef = null; 
     if (isEmpty()) 
     { 
      addLast(new Person(fn, sn, bir, det)); 
     } 
     else 
     { 
      hRef = getFirst(); 
      while (hRef.getNext().getElement().getbirthyear() < bir && hRef.getNext() != trailer) 
      { 
       hRef = hRef.getNext(); 
      } 
      addAfter(hRef, new Person(fn, sn, bir, det)); 
     } 
    } 




    /** 
    * 
    */ 
    public Person searchPerson(String fn) 
    { 
     return search(fn).getElement(); 
    } 

    /** 
    * søker etter hendelse 
    * 
    * @param desc hendelsen vi søker etter 
    * @return hendelsen om den er der 
    */ 
    public DNode<Person> search(String fn) 
    { 
     DNode<Person> hRef = header; 
     DNode<Person> e = null; 
     if (!isEmpty()) 
     { 
      do 
      { 
       hRef = hRef.getNext(); 
      } 
      while (!hRef.getElement().getFirstName().equalsIgnoreCase(fn)); 
      if (hRef != trailer && hRef.getElement().getFirstName().equals(fn)) 
      { 
       e = hRef; 
      } 
      else 
      { 
       System.out.println("No such person."); 
      } 
     } 
     return e; 
    } 

    /** 
    * sorterer listen etter årstall 
    */ 
    public void sortPersons() 
    { 
     if (size() <= 1) 
     { 
      return; 
     } 
     DNode<Person> pivot; 
     DNode<Person> ins; 
     DNode<Person> end = (DNode<Person>) getFirst(); 
     while(end != getLast()) 
     { 
      pivot = end.getNext(); 
      removeElement(pivot); 
      ins = end; 
      while (hasPrev(ins) && ins.getElement().getbirthyear() > pivot.getElement().getbirthyear()) 
      { 
       ins = ins.getPrev(); 
      } 
      addAfter(ins, pivot.getElement()); 
      if (ins == end) 
      { 
       end = end.getNext(); 
      } 
     } 
     indexNodes(); 
    } 


    } 

@Override 

public String toString() 
    { 
     String listPerson = ""; 
     if (!isEmpty()) 
     { 
      listPerson = "Persons:\n"; 
      DNode<Person> hRef = header.getNext(); 
      while (hRef != trailer) 
      { 
       listPerson += hRef.getIndex() + " " + hRef.getElement().getFirstName() + " " + hRef.getElement().getSurname() + "(" + hRef.getElement().getbirthyear() + " - " + hRef.getElement().getdeathyear() + ")"; 
       hRef = hRef.getNext(); 
       if (hRef != trailer) 
       { 
        listPerson += "\n"; 
       } 
      } 
     } 
     else 
     { 
      listPerson = "No people registered."; 
     } 
     return listPerson; 
    } 

在文本用戶界面中添加1個人後,它不會給任何人註冊。

回答

2

在Menutext中,您應該在使用之前初始化您的personList。

private PersonList personList = new PersonList(); 
+0

謝謝!沒有更多的空指針。但現在當我嘗試使用上面添加的toString方法打印時,我只收到「沒有人註冊」。 – user733299 2011-05-01 13:46:16

+1

@ user733299 - stacker回答了您的問題,請接受它,正如您所說的那樣解決了問題。如果您有其他問題,歡迎您將其作爲單獨問題發佈。請嘗試下次更多地設置代碼的格式,以便那些試圖幫助您的人的眼睛不會彈出:) – MByD 2011-05-01 16:11:38

+0

@ user733299要調試代碼,您應該使用單步設置斷點或跟蹤執行,並觀察變量。如果您不使用IDE,則至少可以添加一些System.out.println來查看哪些變量爲空。 – stacker 2011-05-02 04:52:14