2 votes

Référence d'objet non définie à une instance d'un objet c#

J'ai les classes génériques suivantes (Node et Liste basée sur les Nodes) :

public class Node<T>
    {
        private T info;
        private Node<T> next;

        public Node(T x, Node<T> next)
        {
            this.info = x;
            this.next = next;
        }

        public Node<T> GetNext()
        {
            return this.next;
        }

        public void SetNext(Node<T> next)
        {
            this.next = next;
        }

        public T GetInfo()
        {
            return this.info;
        }

        public void SetInfo(T x)
        {
            this.info = x;
        }

        public override string ToString()
        {
            return this.info.ToString();
        }
    }

    public class List<T>
    {

        private Node<T> first;

        public List()
        {
            this.first = null;
        }

        public Node<T> GetFirst()
        {
            return this.first;
        }

        public Node<T> Add(Node<T> pos, T x)
        {
            Node<T> temp = new Node<T>(x, null);

            if (pos == null)
            {
                temp.SetNext(this.first);
                this.first = temp;
            }
            else
            {
                temp.SetNext(pos.GetNext());
                pos.SetNext(temp);
            }

            return temp;
        }

        public Node<T> Remove(Node<T> pos)
        {
            if (this.first == pos)
                this.first = pos.GetNext();
            else
            {
                Node<T> prevPos = this.GetFirst();
                while (prevPos.GetNext() != pos)
                    prevPos = prevPos.GetNext();
                prevPos.SetNext(pos.GetNext());
            }

            Node<T> nextPos = pos.GetNext();
            pos.SetNext(null);

            return nextPos;
        }

        public override string ToString()
        {
            string str = "[";
            Node<T> pos = this.first;
            while (pos != null)
            {
                str += pos.GetInfo().ToString();
                if (pos.GetNext() != null)
                    str += ", ";
                pos = pos.GetNext();
            }

            str += "]";

            return str;
        }
    }

Ce que je veux faire, c'est deux fonctions en classe pour la classe List. - La première fonction fera la somme de tous les nombres de la liste qui sont en position paire. - La deuxième fonction vérifiera si la liste est triée par ordre alphabétique.

Ce que j'ai fait :

   public int SumElementsOnEven()
    {
        int sum = 0;
        Node<T> pos = this.first;
        while (pos != null)
        {
            sum += int.Parse(pos.GetInfo().ToString());
            pos = pos.GetNext().GetNext();
        }
        return sum;
    }

    public bool isAlpha()
    {
        Node<T> pos = this.first;
        while (pos != null)
        {
            string a = pos.GetInfo().ToString();
            string b = pos.GetNext().GetInfo().ToString();
            if (a[0] < b[0])
                return false;
            pos = pos.GetNext();
        }

        return true;
    }

Mais il renvoie une erreur dans les deux cas.

La référence de l'objet n'a pas été fixée à une instance d'un objet.

Dans l'endroit où je fais deux fois :

GetNext().GetNext();

Cela permet de sauter un élément de plus. Et la deuxième erreur à cet endroit :

string b = pos.GetNext().GetInfo().ToString();

Parce que je veux comparer deux éléments. En fait, c'est comme sauvegarder une référence à partir d'une référence ou peut-être que je me trompe ? Quoi qu'il en soit, comment puis-je résoudre ce problème ?

3voto

The Scrum Meister Points 17215

pos.GetNext() retournera null cuando pos est le dernier nœud de la liste, vous devez donc vérifier avant d'appeler .GetNext() sur une référence nulle :

while (pos != null)
{
    sum += int.Parse(pos.GetInfo().ToString());
    pos = pos.GetNext();
    if(pos != null)
        pos = pos.GetNext();
}

Même chose dans le isAlpha() méthode :

while (pos != null)
{
    string a = pos.GetInfo().ToString();
    pos = pos.GetNext();
    if(pos == null)
        return true;
    string b = pos.GetInfo().ToString();
    if (a[0] < b[0])
        return false;
}

0voto

Hogan Points 30189

Vous obtenez cette erreur parce qu'il n'y a pas d'élément suivant. Vous devez modifier votre code pour vérifier les éléments nuls.

Par exemple :

if (GetNext() != null)
  // do something here!
else
  // deal with case where there is no next here.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X