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(); } }
}
堆栈溢出
{◕ ◡ ◕}
throw new NullReferenceException()
(顺便说一句,您不应该这么做)。我不知道这是否算数,因为它不是真正的空引用编辑:马克·拜尔斯,谢谢你的第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表示“猜测是不可接受的调试方式”.这种事发生的频率真是太高了。