8

一位同事向我展示了一种非常奇怪的行为,我想知道是否有人可以解释我为什么。

具有 2 个字符串参数的基本构造函数:

    public MyClass(string str1, string str2)
    {
        this.s1 = str1;
        this.s2 = str2;
        this.s3 = Method(str2 + "._className", str1);
    }

方法是:

public string Method(string key, string defaultValue)
{
    List<string> list = _vars[key];
    if (list == null) return defaultValue;
    string res = "";
    foreach (string s in list)
    {
        if (res != "") res += ",";
        res += s;
    }
    return res;
}

str2as的 aspx 页面中调用此 ctor 时null,一切正常,因为如果字符串连接的操作数+null,则替换为空字符串。

str2但是当null在后台线程中调用这个 ctor 时,NullReferenceException会触发 a。

这个问题str2 != null在使用前通过测试解决了,但我真的很想知道为什么相同的代码有时会引发异常,有时不会!

这是堆栈跟踪:

Exception: System.NullReferenceException 
Message: Object reference not set to an instance of an object.
StackTrace: 
at MyClass..ctor(String str1, String str2) 
at AbandonedCartsNotificationJob.NotifyAbandonedCarts() in AbandonedCartsNotificationJobPartial.cs:line 39 
at AbandonedCartsNotificationJob.work() in AbandonedCartsNotificationJob.cs:line 15 
at MyRuntime.JobManager.run() 
at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
at System.Threading.ExecutionContext.runTryCode(Object userData) 
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Threading.ThreadHelper.ThreadStart()
4

2 回答 2

4

在 .NET Framework 的字符串连接实现中存在一个不为人知的错误,但它只影响 4 个对象的连接,其中一个对象是非 nullToString提供了对返回的 null的覆盖。显然,这里的情况并非如此。

这种情况很可能是由以下原因之一引起的:

  • _varsMethod被调用时为空
  • 由于_vars在多线程应用程序中的误用,内部状态_vars已损坏,导致使用NullReferenceExceptionwhen 运算符[]
于 2013-07-25T15:15:21.983 回答
3

问题在于MethodObject的实现。由于+ 运算符实现将 null 值解释为空字符串。设置时,实际的 null 值永远不会进入构造函数str2。相反,str1直接作为空值输入,根据实现可能会导致空引用异常。

于 2013-07-25T14:13:46.630 回答