6

在我的一种方法开始时,我有一个非常简单的检查,如下所示:

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

    //Do other stufff....
}

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

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 的原因有点困惑!

任何人都可以提出可能导致这种情况的场景吗?

编辑:我怀疑“事物”可能为空,但我真的希望 ArgumentNullException 而不是 NullReferenceException - 这基本上就是这个问题的意义所在。是否有框架或 Elmah 正在改变或错误报告异常 - 或者是二进制文件在某种程度上已经过时的唯一解释?

4

5 回答 5

4

if (thing == null)扔一个是不可能的NullReferenceException

这意味着正在发生其他事情。是时候开始运用你的想象力了,并下定决心忽略if导致问题的可能性。

于 2012-10-16T01:01:12.617 回答
2

if 语句可能会抛出NullReferenceExceptionif MyClass==错误地定义了运算符,例如

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);
   } 
}
于 2012-10-16T01:19:44.873 回答
1

看起来异常来自调用 MyMethod 的链上的东西。MyMethod() 抛出异常,上面没有处理它,所以无论你使用什么 web 框架都会抛出 HttpUnhandledException。

于 2012-10-16T00:57:34.050 回答
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;
}
于 2015-01-05T23:49:55.513 回答
-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....
}
于 2012-10-16T01:07:54.123 回答