代码适用于一种情况,但不适用于其他情况

时间:2015-08-28 05:05:39

标签: c# arrays class object case

我通过;

声明了4个对象数组
Student[,] s2 =new BSIT[10,4];
s2[studCount,iden] = new BSIT();        

Student[,] s3 = new BSCS[10,4];
s3[studCount,iden] = new BSCS();

Student[,] s4 = new MSIT[10,4];
s4[studCount,iden] = new MSIT();

Student[,] s5 = new MSCS[10,4];
s5[studCount,iden] = new MSCS();

然后我做了一些案例切换语句,要求提供如下名称:

case 1://BSIT
{
     iden=0;
     Console.Write("Enter Name: ");
     (s2[studCount,iden]).setName(Console.ReadLine());
     do
     {
        Console.Write("Enter Age(15-30 only): ");
        int a = int.Parse(Console.ReadLine());

        if(a>=15 && a<=30)
        {
            (s2[studCount,iden]).setAge(a);
            valid=1;
        }
        else
        {
            valid=0;
            Console.WriteLine("INVALID INPUT. TRY AGAIN.");
        }
     }
     while(valid==0);
}

但是当我尝试在其他对象上输入名称时,例如:

case 2://BSCS
{
    iden = 1;
    Console.Write("Enter Name: ");
    (s3[studCount,iden]).setName(Console.ReadLine());       
    do
    {
        Console.Write("Enter Age(15-30 only): ");
        int a = int.Parse(Console.ReadLine());

        if(a>=15 && a<=30)
        {
            (s3[studCount,iden]).setAge(a);
            valid=1;
        }
        else
        {
            valid=0;
            Console.WriteLine("INVALID INPUT. TRY AGAIN.");
        }
    }
    while(valid==0);
}
  

它为我提供了System.NullReferenceException:Object Reference未设置为object的实例。

是的,基类(称为&#34;学生&#34;)具有所有&#34;名称&#34; setter和getter,而派生类BSIT和BSCS都得到了&#34; Name&#34;来自学生班的字段。

当我为BSIT输入信息时,程序如何工作正常,但BSCS,MSIT和MSCS没有? MSIT和MSCS遵循与BSIT和BSCS完全相同的格式,但它们仍然无法正常工作。

2 个答案:

答案 0 :(得分:3)

<强>问题:

您只是初始化1个元素

s2[studCount,iden] = new BSIT();
//and so on

我认为这是0,所以无论何时访问索引[studCount,0]上的元素,它都可以正常工作。但不是其他因素。

<强>解决方案:

iden = 1;
Console.Write("Enter Name: ");
s3[studCount,iden] = new BSCS(); //just initialize it before use
(s3[studCount,iden]).setName(Console.ReadLine());     

您的情景:

您必须根据Student保存Discipline。这就是为什么你生成一个有4列(BSIT,BSCS,MSIT,MSCS)的数组,但你并没有像你应该那样使用它们。您创建了4个包含4列的数组,现在使用您的方法,您的数组最终会有一些空元素。

您的方法应该是:

你的班级结构是:

Student
    BSIT
    BSCS
    MSIT
    MSCS

所以只需创建一个Student数组并在其中放入不同的子类实例。

Student[,] students = new Student[10,4]; //index 0 is for BSIT, 1 for BSCS and so on..

我只是在这里编写2个案例来帮助您理解工作:

case 1://BSIT
{
     iden = 0;
     Console.Write("Enter Name: ");
     //here you'll initialize the object
     students[studCount, iden] = new BSIT();    //Student is base, so it can contain all of it's child objects

     (students[studCount, iden]).setName(Console.ReadLine());
     do
     {
        Console.Write("Enter Age(15-30 only): ");
        int a = int.Parse(Console.ReadLine());

        if(a>=15 && a<=30)
        {
            (students[studCount, iden]).setAge(a);
            valid=1;
        }
        else
        {
            valid=0;
            Console.WriteLine("INVALID INPUT. TRY AGAIN.");
        }
     }
     while(valid==0);
}

case 2://BSCS
{
    iden = 1;
    Console.Write("Enter Name: ");
    (s3[studCount,iden]).setName(Console.ReadLine());  

    iden = 1;
     Console.Write("Enter Name: ");
     //here you'll initialize the object
     students[studCount, iden] = new BSCS();    //Student is base, so it can contain all of it's child objects (here we're initializing BSCS)

    (students[studCount, iden]).setName(Console.ReadLine()); 
    //your code...

现在没有什么会覆盖,所有学科都会在他们指定的列上。

注意:我更改了数组的名称,因此请在代码处修复

答案 1 :(得分:2)

这是因为在初始化代码中,您在索引studCountiden初始化对象:

Student[,] s2 =new BSIT[10,4];
s2[studCount,iden] = new BSIT();

因此,这适用于案例1,因为位置studCount,iden处的元素已初始化。

但是,对于案例2,您正在执行此代码:

iden = 1;

因此,您无需访问已初始化的s2[studCount,0],而是访问未初始化的s2[studCount,1](即s2[studCount,1] == null

解决这个问题的一种方法是在访问数组的任何元素之前,你可以验证它是否为空,然后才使用它:

iden = 1;
Console.Write("Enter Name: ");
if(s3[studCount,iden] == null)
    s3[studCount,iden] = new BSCS();
(s3[studCount,iden]).setName(Console.ReadLine());       

或者在创建数组后立即初始化所有数组项。