C# C语言中的面试问题#

C# C语言中的面试问题#,c#,nullreferenceexception,C#,Nullreferenceexception,一位技术负责人问我以下问题: 他创建了一个类,声明了一个对象并初始化了它。但在某些情况下,我们可能会遇到“空引用”异常。 他评论说有1000个可能的原因导致这种例外,并让我猜一个原因。 我想不出来。原因是什么,我们可能会出现这样的异常?不是专家,只是胡乱猜测,内存不足?如果它是多线程应用程序,那么其他线程可能会出现,并将对象设置为空引用。您总是可以将某些内容初始化为空值 public class MyClass { // initialized to null private s

一位技术负责人问我以下问题:
他创建了一个类,声明了一个对象并初始化了它。但在某些情况下,我们可能会遇到“空引用”异常。
他评论说有1000个可能的原因导致这种例外,并让我猜一个原因。

我想不出来。原因是什么,我们可能会出现这样的异常?

不是专家,只是胡乱猜测,内存不足?

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

您总是可以将某些内容初始化为空值

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(); } }
}
堆栈溢出

{◕ ◡ ◕}

  • 您使用了已显式设置为null的对象引用,或者
  • 您使用了隐式设置为null的对象引用,或者
  • 在您的代码或您调用的代码中,有一条语句
    throw new NullReferenceException()
    (顺便说一句,您不应该这么做)。我不知道这是否算数,因为它不是真正的空引用
  • 我想不出还有其他997个原因


    编辑:马克·拜尔斯,谢谢你的第3点。

    我可以想出一些办法:

    • 构造函数可以在完成之前抛出
      NullReferenceException
    • 访问属性时,该属性可以抛出
      NullReferenceException
    • 如果您在代码周围有一个
      尝试{}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.
        }
    }
    

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


    999去。

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

    我认为面试官实际上是在寻找如何着手解决问题,即您将采取什么故障排除步骤来解决可能由t引起的问题不同的东西

    他创建了一个类,声明了一个对象 并初始化了它,但在某些情况下 在这种情况下,我们可能会得到“null” “参考”例外。他评论道 有1000个可能的原因 对于这样的例外,请我 猜一个原因,我不能 把它弄清楚。这是什么 原因,我们可能会得到这样一个 例外

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

    不那么直截了当的回答:假设你的面试官不是白痴,他可能会对你的调试技能感到失望。如果你收到一份糟糕的错误报告,你会立即举手投降,还是试图解决它

    猜测不是调试错误的一种可接受的方式。第一步是在您的机器上复制错误

    它是否可靠地复制?如果是,请取出调试器

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

    如果没有,请询问发现错误的人进行复制。当您按照最初发现错误的人的相同步骤进行操作时,您可以复制吗?如果是,请参见上文

    如果没有,环境中是否存在差异?配置文件?数据库中的数据?是否使用最新的service Pack、软件更新等更新环境


    你不能给面试官一个答案,但你可以给他一张清单,列出你最终得到答案的步骤。

    我希望他比你更好地解释这个问题……这是一个多么愚蠢的面试问题。它并不是真的愚蠢,它让他思考,也会让面试官了解他是如何思考和处理问题的“狡猾”的问题。我怀疑面试官对他的实际答案感兴趣,但更多的是他是如何得出答案的。几乎所有的
    NullReferenceException
    案例都是一样的。请参阅”“需要一些提示。请有人将此作为的副本关闭?我已经投票决定关闭它,因此无法再次关闭。在.NET中,我相信存在OutOfMemoryException,这就是您将得到的(除非您处理OutOfMemoryException并像没有问题一样继续:d)@迈克,你不能做这样的事;)嗯?我不明白为什么OOM条件不能被优雅地处理。我不相信你还能抓住记忆异常。我很想+1。但是我wont@Mithat:没关系,反正我给你最爱的阿凡达加上+1!+1表示“猜测是不可接受的调试方式”.这种事发生的频率真是太高了。