执行while属性循环导致堆栈

时间:2012-10-23 19:46:07

标签: c# exception null

我最近开始尝试自学C#,这是初学者尝试在属性中使用业务规则的尝试,在我的案例中是FurColor。当我运行下面的程序时,我得到一个NullReferenceException。有人可以帮我找到这个错误的原因吗?例外情况发生在第15行

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _10_23_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("programming practice!");
            Dog d = new Dog();
            Console.Write("what color is your dog: ");
            d.FurColor = Console.ReadLine();
            Console.WriteLine("the color of your dog is {0}", d.FurColor);
        }
    }
    class Dog
    {
        private string furColor;
        private string petName;
        private int tagNum;

        public Dog() { }

        public Dog(string color, string name, int tagID)
        {
            furColor = color;
            petName = name;
            tagNum = tagID;
        }
        //properties
        public string FurColor
        {
            get { return furColor; }
            set {                    
                    do
                    {
                        Console.Write("enter in a viable color type: ");
                    }
                    while (furColor.Length > 10);
                    furColor = value;
                }
        }
        public string Name
        {
            get { return petName; }
            set { petName = value; }
        }
        public int TagNum
        {
            get { return tagNum; }
            set { tagNum = value; }
        }

    }
}

6 个答案:

答案 0 :(得分:2)

一旦纠正,你将获得无限循环。

附注:您不应该在您的财产的Set子句中要求输入。

您应该更喜欢要求输入的成员函数,检查它是否有效,然后设置颜色。

在你的狗类中添加一个如下所示的函数:

public void setFurColor()
{
    string color = string.Empty;
    do
    {
        Console.Write("what color is your dog: ");
        color = Console.ReadLine();
    }while ( ! string.IsNullOrEmpty(color)  && bleh.Length < 10);
    this.furColor = color;
}

答案 1 :(得分:1)

在访问furColor.Length

之前,检查 furColor 是否为null

答案 2 :(得分:1)

你的代码没有任何意义,但是你可以学习如何编码。 :)

所以 - 如果用户输入长度超过10个字符的字符串,我想你只想存储furColor。如果是这样,你应该在将值赋给对象属性之前检查字符串是否正常,如果没有,则循环使用类属性代码的警告消息OUTSIDE。

答案 3 :(得分:1)

要制作你工作的代码:你在没有设置furcolor的情况下访问furColor.Length ...此时它没什么(null)。你应该检查value

此外,这不是您想要在属性的setter中使用的那种逻辑。你的setter不应该输出读数值,它应该简单地将属性设置为它的用途。将while循环放在主页中。

答案 4 :(得分:1)

您正在使用Dog的公共无参数构造函数

public Dog() { }

此构造函数未设置furColor字段,因此在Dog实例中它将为null。

这意味着访问以下行中furColor字段的Length属性将抛出NullReferenceException。

while (furColor.Length > 10);

解决此异常的一种方法是将默认值设置为无参数构造函数中的那些字段,如下所示:

public Dog() : this("brown", "Fido", default(int))
{
}

或者,您可以:

  • 使用带参数的构造函数,为furColor传入非空值。
  • FurColor属性设置器中检查为空。
  • 设置声明它的field

答案 5 :(得分:1)

在访问其长度之前,需要为furColor变量分配和/或检查null。由于您使用的是默认构造函数,因此永远不会分配给furColor字符串。 您需要从默认值中调用其他构造函数:

public Dog() : this("defaultColor", "defaultName", default(int)) {}

话虽这么说,在一个属性中要求用户输入并不是一个好的编程习惯,你最终会在你的属性中使用无限循环。