我在其中一个方法的开头有一个非常简单的检查,如下所示:
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正在改变或错误报告异常 - 或者是二进制文件以某种方式过时的唯一解释?答案 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....
}