C#中的面试问题

时间:2010-04-01 13:29:31

标签: c# nullreferenceexception

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

10 个答案:

答案 0 :(得分:11)

  1. 您已使用明确设置为null的对象引用,或
  2. 您使用了隐式设置为null的对象引用,或
  3. 代码中的某个地方,或者您调用的代码中,有一个语句throw new NullReferenceException()(顺便说一下,您不应该这样做)。我不知道这是否重要,因为它不是真正的空引用。
  4. 我想不出任何其他997个理由。

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

答案 1 :(得分:8)

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

答案 2 :(得分:7)

堆栈溢出?

{◕◡◕}

答案 3 :(得分:7)

我能想到的几种方式:

  • 构造函数可以在完成之前抛出NullReferenceException
  • 当您访问属性时,该属性可以抛出NullReferenceException
  • 如果代码周围有try { } finally { },如果它抛出异常,则finally运行并且finally中的代码可以抛出NullReferenceException
  • 在分配期间可能会进行隐式转换,转化代码会引发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.
    }
}

答案 4 :(得分:6)

  

他创建了一个类,声明了一个对象   并初始化它。但在某些方面   情况我们可能会“无效”   参考“例外。他评论道   有1000个可能的原因   对于这样的例外并问我   猜一个原因。我无能为力   想办法。什么是   理由,我们可能得到这样的   异常?

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

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

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

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

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

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

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

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

答案 5 :(得分:4)

不是专家,只是一个疯狂的猜测,内存不足?

答案 6 :(得分:4)

您始终可以将某些内容初始化为空值;

public class MyClass
{
    // initialized to null
    private string _myString = null;

    // _myString is initialized, but this throws null reference
    public int StringLength { get { return _myString.Length(); } }
}

答案 7 :(得分:1)

有问题的对象可能包含未在主对象的构造函数中初始化的其他对象。该问题未指定出现空引用异常的位置或时间。

999去。

答案 8 :(得分:1)

在多线程代码中,可以在创建对象之后但在将变量分配给其位置之前访问变量。

答案 9 :(得分:0)

我认为面试官实际上正在寻找你将如何解决问题,即你要采取什么样的故障排除步骤来解决可能由千种不同的事情引起的问题。