在不可能的情况下获取NullReferenceException(检查null时)

时间:2012-10-16 00:49:34

标签: c# nullreferenceexception

我在其中一个方法的开头有一个非常简单的检查,如下所示:

public void MyMethod(MyClass thing)
{
    if(thing == null)
        throw new ArgumentNullException("thing");

    //Do other stufff....
}

但是我得到了堆栈跟踪(来自生产环境中的Elmah),这似乎表明“if(thing == null)”行正在抛出NullReferenceException。堆栈跟踪的前两行是这样的:

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at MyLibrary.BL.AnotherClass.MyMethod(MyClass thing) in C:\Development\MyProject\trunk\MyLibrary.BL\AnotherClass.cs:line 100

MyClass是一个相当简单的类,没有运算符重载或类似的东西,所以我有点难过抛出NullReferenceException!

有人可以提出可能导致这种情况的情景吗?

编辑:我怀疑“thing”可能为null,但我真的希望ArgumentNullException不是NullReferenceException - 这基本上就是这个问题的内容。是否有一些框架或Elmah正在改变或错误报告异常 - 或者是二进制文件以某种方式过时的唯一解释?

5 个答案:

答案 0 :(得分:4)

if (thing == null)无法抛出NullReferenceException

这意味着其他事情正在发生。现在是时候开始运用你的想象力和坚定的决心来忽略if引发问题的可能性。

答案 1 :(得分:2)

如果MyClass错误地定义NullReferenceException运算符,则if语句可以抛出==,例如

class MyClass
{
   int A {get;set;}

   public static bool operator ==(MyClass a, MyClass b)
   {
      return a.A == b.A;
   }

   public static bool operator !=(MyClass a, MyClass b)
   {
      return !(a == b);
   } 
}

答案 2 :(得分:1)

看起来异常来自调用MyMethod的链条。 MyMethod()抛出Exception,上面没有任何东西正在处理它,所以你所处的任何Web框架都抛出了HttpUnhandledException。

答案 3 :(得分:0)

我也遇到过这种不可能的情况。原来是由于使用了as关键字,我不知道为什么。我使用的是SharpPdf库并且有一行代码如下:

var destElement = annotDict.Elements["/Dest"] as PdfName;
if (destElement == null)
{
    continue;
}

如果删除as PdfName部分,则可以正常工作。所以我现在在我的代码中有两个级别的检查:

var destElement = annotDict.Elements["/Dest"];

if (destElement == null)
{
    continue;
}

var destElementName = destElement as PdfName;
if (destElementName == null)
{
    continue;
}

答案 4 :(得分:-3)

东西是空的。

那会导致它。

[编辑]:这是我测试过的代码:

protected void Button3_Click(object sender, EventArgs e)
{
    MyMethod(null);
}

public void MyMethod(String thing)
{
    if (thing == null)   //  This caused the exception to be thrown.
        throw new Exception("test");

    //Do other stufff....
}