我通过;
声明了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完全相同的格式,但它们仍然无法正常工作。
答案 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)
这是因为在初始化代码中,您在索引studCount
和iden
初始化对象:
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());
或者在创建数组后立即初始化所有数组项。