Java — добавление пользователя в связанный список через текстовый пользовательский интерфейс

#java #user-interface #text #linked-list

#java #пользовательский интерфейс #текст #связанный список

Вопрос:

При попытке добавить пользователя, он просто выдает ошибку нулевого указателя на personList.AddPersonSort . Пожалуйста, помогите.

     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 amp;amp; 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 amp;amp; 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) amp;amp; 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 человека в текстовый пользовательский интерфейс.

Ответ №1:

В Menutext вы должны инициализировать свой PersonList перед использованием.

 private PersonList personList = new PersonList();
  

Комментарии:

1. Спасибо! больше нет указателя нуля. но теперь я получаю только «никто не зарегистрирован», когда пытаюсь распечатать его с помощью метода toString, который я добавил выше

2. @user733299 — stacker ответил на ваш вопрос, пожалуйста, примите его, поскольку вы сказали, что это решило проблему. Если у вас возникла другая проблема, вы можете опубликовать ее как отдельный вопрос. Пожалуйста, попробуйте в следующий раз немного больше форматировать свой код, чтобы глаза тех, кто пытается вам помочь, не вылезали из орбит 🙂

3. @user733299 Для отладки вашего кода вы должны установить точки останова или отслеживать выполнение с помощью одного шага и следить за своими переменными. Если вы не работаете с IDE, вы могли бы, по крайней мере, добавить несколько System.out.println, чтобы увидеть, какие переменные имеют значение null.