【问题标题】:Code works for one case but not other cases代码适用于一种情况,但不适用于其他情况
【发布时间】:2015-08-28 05:05:39
【问题描述】:

我通过;声明了 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 switch 语句,要求输入如下名称:

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 not set to instance of object。

是的,基类(称为“Student”)具有所有“Name”setter 和 getter,而派生类 BSIT 和 BSCS 都只是从 Student 类中获取“Name”字段。

为什么我为 BSIT 输入信息时程序可以正常工作,但不能为 BSCS、MSIT 和 MSCS 输入信息? MSIT 和 MSCS 遵循与 BSIT 和 BSCS 完全相同的格式,但它们仍然不起作用。

【问题讨论】:

  • 哦,澄清一下,BSCS 也不起作用,即使它遵循与 BSIT 相同的格式。
  • 尝试在 BSCS 中设置iden = 0 并检查是否仍然抛出异常?
  • 我做不到。我需要 BSCS 中的 iden = 1 因为 iden = 0 用于 BSIT。 iden = 1 用于 BSCS,iden = 2 用于 MSIT,iden=3 用于 MSCS。如果我将其设置为零,它会起作用,但我稍后会覆盖一些数据。
  • 不,您不会覆盖它,每个学科都有不同的数组。实际上,您的方法是错误的,因为您打算将数据放在一个数组中(这就是您在其中创建 4 列的原因),但是您还为所有学科初始化了单独的数组。如果每个学科都有不同的标识号,请删除所有数组并只保留一个数组。

标签: c# arrays class object case


【解决方案1】:

问题:

你只是在初始化 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());     

您的场景:

你必须根据他们的Discipline保存Students。这就是为什么您生成了一个包含 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...

现在什么都不会覆盖,所有学科都将位于其指定的列。

注意:我已经更改了数组的名称,所以请在您的代码中到处修复它

【讨论】:

  • 我需要对每个字段进行初始化吗?名字不是我应该在每个案例中输入的唯一内容。我需要输入年龄、性别和地址等信息。
  • @Jester 您有一个可以包含对象的数组,但实际上并没有在其中放入任何对象。您需要创建对象,然后您可以根据需要设置该对象的所有属性。
  • 不,所有字段都在类中,您只需初始化一次类。不需要对每个领域都这样做。
  • 好的,问题解决了。我确实有另一个问题,但我会提出一个不同的问题。谢谢你们。 :)
  • @Jester 等待几分钟,我正在更新答案,以帮助您以更好的方法完成它。您在这里误解了 OOP。
【解决方案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());       

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

【讨论】:

  • 那么我该如何初始化其他对象呢?我在课堂上没有被教过如何做到这一点。
  • 您可以检查 null 并在它为 null 时对其进行初始化,就像我在答案的最后一个代码 sn-p 中显示的那样
  • 哦,我明白了。您创建了一个 if 语句,该语句仅在抛出空值时才进行初始化。那是天才。
猜你喜欢
  • 2016-03-14
  • 2021-12-28
  • 1970-01-01
  • 2014-05-24
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多