C#中的面试问题

amu*_*tha 7 c# nullreferenceexception

技术负责人问我以下内容:
他创建了一个类,声明了一个对象并对其进行了初始化.但在某些情况下,我们可能会得到"空引用"异常.
他评论说,这种例外有1000种可能的原因,并让我猜出一个原因.
我无法弄清楚.什么是原因,我们可能会得到这样的例外?

eri*_*len 11

  1. 您已使用已明确设置为null的对象引用,或
  2. 您已使用隐式设置为null的对象引用,或
  3. 在代码中的某个地方,或者在您调用的代码中,都有声明throw new NullReferenceException()(顺便说一下,您不应该这样做).我不知道这是否重要,因为它不是真正的空引用.

我想不出任何其他997个原因.

编辑:谢谢,Mark Byers,第3点.


Mat*_*ves 8

如果它是一个多线程应用程序,那么可能会出现一些其他线程并将该对象设置为空引用.


Dar*_*ent 7

堆栈溢出?

{◕◡◕}

  • 我很乐意+1.但我不会 (5认同)

Mar*_*ers 7

我能想到的几种方式:

  • 构造函数可以NullReferenceException在完成之前抛出一个.
  • 当您访问一个属性时,该属性可以抛出一个NullReferenceException.
  • 如果你有一个try { } finally { }代码,如果它抛出异常,则finally运行,finally中的代码可以抛出一个NullReferenceException.
  • 在赋值期间可能存在隐式转换,并且转换的代码会抛出a NullReferenceException.

这是最后一个的示例代码:

class Foo {}

class Bar
{
    public static implicit operator Foo(Bar bar)
    {
        throw new NullReferenceException();
    }
}

class Program
{
    public static void Main()
    {
       Foo foo = new Bar(); // This causes a NullReferenceException to be thrown.
    }
}
Run Code Online (Sandbox Code Playgroud)


Jul*_*iet 6

他创建了一个类,声明了一个对象并对其进行了初始化.但在某些情况下,我们可能会得到"空引用"异常.他评论说,这种例外有1000种可能的原因,并让我猜出一个原因.我无法弄清楚.什么是原因,我们可能会得到这样的例外?

直截了当的回答:我告诉面试官你不能调试你看不到的代码.要求查看有问题的代码行和调试器.

不那么直截了当的答案:假设你的面试官不是白痴,他可能会因为你的调试技巧而感到沮丧.如果你得到一个糟糕的错误报告,你是否会立即投掷并投降,或者你是否尝试解决它.

猜测不是调试错误的可接受方式.第一步是重现你机器上的错误.

它可靠地重现吗?如果是,请调试您的调试器.

如果不是,您可以间歇性地或非确定性地再现它吗?异常是在代码中的不同位置或不同的线程上随机发生的吗?如果是,你可能有某种竞争条件,或者可能是一个损坏的指针.

如果不是,请询问发现错误的人是否重现.当您按照与最初发现错误的人相同的步骤时,您可以重现吗?如果是,请参阅上文.

如果不是,环境是否存在差异?配置文件?数据库中的数据?是否使用最新的服务包,软件更新等更新了环境?

您将无法向面试官提供答案,但您可以向他提供一系列步骤,以便最终得到答案.

  • +1"猜测不是一种可接受的调试方式".令人惊讶的是这种情况经常发生. (2认同)

Aar*_*ian 4

不是专家,只是凭空猜测,记不清了?

  • 在 .NET 中,我相信存在 OutOfMemoryException,这就是您会得到的(除非您处理了 OutOfMemoryException 并继续正常运行:D) (6认同)
  • @Mike你不能做这样的事;) (2认同)