没有成员访问时怎么会出现 NullReferenceException?
How can a NullReferenceException occur when there is no member access?
编辑
- 这个问题不是:什么是 NullReferenceException? NullReferenceException 在访问成员的空引用时发生。
- 这个问题是:没有成员访问时怎么会出现NullReferenceException?
编辑结束
据我所知,只有在访问引用类型的成员时才会出现NullReferenceException
。据我所知, "references" this
和 base
永远不能为空。
今天我遇到了一个 属性,它抛出一个 NullReferenceException
,但没有成员访问权限(this
和 base
的成员除外)。
我的问题是:如何!
这是代码:
public class ComponentObject : Base
{
private readonly XmlNamespaceManager _nsmgr;
public XmlNode FieldGroupContainerWerknemers { get { ... } }
public string NumberOfMngDirectorMainShareholders
{
get
{
XmlNode fieldGroupContainerWerknemers = this.FieldGroupContainerWerknemers;
return base.GetValue(fieldGroupContainerWerknemers, this._nsmgr, "./ns1:FieldGroup//ns1:DynamicFields//ns1:Field[@Name='DgaAantal']//ns1:Value");
}
}
}
这是个例外:
Exception type: NullReferenceException
Source: Turien.Interfaces.BizTalk.Policy.Helpers
Target Site: System.String get_NumberOfMngDirectorMainShareholders()
The following is a stack trace that identifies the location where the exception occured
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchCertigo.ComponentObject.get_NumberOfMngDirectorMainShareholders()
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateCurrentCoverageData()
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateLetterDataBatchE()
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateContract()
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateBatch(XmlDocument outputdata)
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchBase`1.CreateBatch(XmlDocument outputdata, String fileName, Int32 outputNumber)
我采取的步骤:
- 我又找了一个 属性
NumberOfMngDirectorMainShareholders
:只有这个
- 我使用 ILSpy 来监视 DLL 内部。生产中的代码与源代码管理中的代码相同。
编辑
对于那些告诉我要调试的人:我很乐意。提出将我的断点放在哪里以及要检查哪些变量的建议。还有更多:如何处理这些信息。例如:如果 this.FieldGroupContainerWerknemers
为 null,那将如何导致这种情况。或者如果 _nsmgr
为 null,它会如何导致此问题(请记住:堆栈跟踪指向此方法/属性!)
JIT 编译器可以在发布版本中内联方法调用(启用优化)。
在您的示例中,get_FieldGroupContainerWerknemers()
或 base.GetValue
可能已被内联。在这种情况下,这些方法中的 NullReferenceException 将使堆栈跟踪指向 get_NumberOfMngDirectorMainShareholders()
.
内联发生在 JIT 编译期间,因此您不会在 IL 代码中看到它。
编辑
- 这个问题不是:什么是 NullReferenceException? NullReferenceException 在访问成员的空引用时发生。
- 这个问题是:没有成员访问时怎么会出现NullReferenceException?
编辑结束
据我所知,只有在访问引用类型的成员时才会出现NullReferenceException
。据我所知, "references" this
和 base
永远不能为空。
今天我遇到了一个 属性,它抛出一个 NullReferenceException
,但没有成员访问权限(this
和 base
的成员除外)。
我的问题是:如何!
这是代码:
public class ComponentObject : Base
{
private readonly XmlNamespaceManager _nsmgr;
public XmlNode FieldGroupContainerWerknemers { get { ... } }
public string NumberOfMngDirectorMainShareholders
{
get
{
XmlNode fieldGroupContainerWerknemers = this.FieldGroupContainerWerknemers;
return base.GetValue(fieldGroupContainerWerknemers, this._nsmgr, "./ns1:FieldGroup//ns1:DynamicFields//ns1:Field[@Name='DgaAantal']//ns1:Value");
}
}
}
这是个例外:
Exception type: NullReferenceException
Source: Turien.Interfaces.BizTalk.Policy.Helpers
Target Site: System.String get_NumberOfMngDirectorMainShareholders()
The following is a stack trace that identifies the location where the exception occured
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchCertigo.ComponentObject.get_NumberOfMngDirectorMainShareholders()
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateCurrentCoverageData()
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateLetterDataBatchE()
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateContract()
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchE.BatchE.CreateBatch(XmlDocument outputdata)
at Turien.Interfaces.BizTalk.Policy.Helpers.BatchTurien.BatchBase`1.CreateBatch(XmlDocument outputdata, String fileName, Int32 outputNumber)
我采取的步骤:
- 我又找了一个 属性
NumberOfMngDirectorMainShareholders
:只有这个 - 我使用 ILSpy 来监视 DLL 内部。生产中的代码与源代码管理中的代码相同。
编辑
对于那些告诉我要调试的人:我很乐意。提出将我的断点放在哪里以及要检查哪些变量的建议。还有更多:如何处理这些信息。例如:如果 this.FieldGroupContainerWerknemers
为 null,那将如何导致这种情况。或者如果 _nsmgr
为 null,它会如何导致此问题(请记住:堆栈跟踪指向此方法/属性!)
JIT 编译器可以在发布版本中内联方法调用(启用优化)。
在您的示例中,get_FieldGroupContainerWerknemers()
或 base.GetValue
可能已被内联。在这种情况下,这些方法中的 NullReferenceException 将使堆栈跟踪指向 get_NumberOfMngDirectorMainShareholders()
.
内联发生在 JIT 编译期间,因此您不会在 IL 代码中看到它。