C# 是否可以在此行中包含System.NullReferenceException?

C# 是否可以在此行中包含System.NullReferenceException?,c#,.net,C#,.net,我们发现了一个异常(不知道为什么Win7嵌入式系统中没有行号): 在这方面,我认为: ThreadPool.QueueUserWorkItem(HandleSaveStatus, (EvDoSaveStatus)systemSwEvent); 我唯一能想到的地方是(EvDoSaveStatus)SystemsEvent。但我做了如下类似的测试: SystemSwEvent ev = new EvDoSaveStatus(); ev = null

我们发现了一个异常(不知道为什么Win7嵌入式系统中没有行号):

在这方面,我认为:

ThreadPool.QueueUserWorkItem(HandleSaveStatus, (EvDoSaveStatus)systemSwEvent); 
我唯一能想到的地方是
(EvDoSaveStatus)SystemsEvent
。但我做了如下类似的测试:

            SystemSwEvent ev = new EvDoSaveStatus();
            ev = null;
            EvDoSaveStatus evt = (EvDoSaveStatus)ev;
            string str = "Is it good?";
没有抛出异常。这意味着
(EvDoSaveStatus)systemSwEvent
即使
systemSwEvent
以某种方式为
null
也可以

如果
EvDoSaveStatus
的一个成员变为null,则不应在上述
ThreadPool
语句中引发异常。我说得对吗

编辑: 在这种情况下:

    case "EvDoSaveStatus":
    {
 Log.logItem(LogType.DebugDevelopment, "EvDoSaveStatus", "dsm::publish()", "EvDoSaveStatus received");
 ThreadPool.QueueUserWorkItem(HandleSaveStatus, (EvDoSaveStatus)systemSwEvent);
  break;
   }
我们有可用的日志条目

EDIT2: 整个发布方法:

public void publish(SystemSwEvent systemSwEvent)
{
    try
    {
        switch (systemSwEvent.eventName)
        {
            case "EvLogin":
                {
                break;
                }
            case "EvLogoff":
                {
                break;
                }
            case "...":
                break;
            case "EvDoSaveStatus":
                {
                    Log.logItem(LogType.DebugDevelopment, "EvDoSaveStatus", "dsm::publish()", "EvDoSaveStatus received");
                    ThreadPool.QueueUserWorkItem(HandleSaveStatus, (EvDoSaveStatus)systemSwEvent);
                    break;
                }
        }
    }
    catch (Exception ex)
    {
        Log.logItem(LogType.Error, "Exception in publish()", "dsm::publish()", "Exception:" + ex + "\nStackTrace:" + ex.StackTrace + "\n" + ex.Message);
    }
}
将导致
evt
为空。您可以将null作为
QueueUserWorkItem
的第二个参数传递,但是您正在排队的回调需要处理它

HandleSaveStatus
必须是,因此它采用对象参数。它试图用那个物体做什么?它是否处理为null的情况

public void HandleSaveStatus(object state){
    if (state == null)
    {
        return; // or whatever else you want to do with a null state
    }
    // Do work with non-null state
}
将导致
evt
为空。您可以将null作为
QueueUserWorkItem
的第二个参数传递,但是您正在排队的回调需要处理它

HandleSaveStatus
必须是,因此它采用对象参数。它试图用那个物体做什么?它是否处理为null的情况

public void HandleSaveStatus(object state){
    if (state == null)
    {
        return; // or whatever else you want to do with a null state
    }
    // Do work with non-null state
}
胡乱猜测

根据,只有当第一个参数
callback
为null时,它才会抛出NullReferenceException

HandleSaveStatus实际上是一种方法吗?如果它是实例方法,您确定在初始化对象之前没有从基类构造函数调用此代码吗

尝试将该行拆分为该行,并查看错误是否仍在第二行:

WaitCallback callback = new WaitCallback(HandleSaveStatus);  
ThreadPool.QueueUserWorkItem(callback, (EvDoSaveStatus)systemSwEvent);
显式构造函数调用(
newwaitcallback
)实际上比必要的更详细,但它表明委托创建是NullReferenceException的另一个可能来源。

根据,只有当第一个参数
callback
为null时,它才会抛出NullReferenceException

HandleSaveStatus实际上是一种方法吗?如果它是实例方法,您确定在初始化对象之前没有从基类构造函数调用此代码吗

尝试将该行拆分为该行,并查看错误是否仍在第二行:

WaitCallback callback = new WaitCallback(HandleSaveStatus);  
ThreadPool.QueueUserWorkItem(callback, (EvDoSaveStatus)systemSwEvent);

显式构造函数调用(
newwaitcallback
)实际上比必要的更详细,但这表明委托创建是NullReferenceExceptions的另一个可能来源。

你绝对确定这一行是罪魁祸首吗?@Lasse:不是100%,而是99%sure@jfs:这是我们仅有的:异常:System.NullReferenceException:对象引用未设置为对象的实例。at XXX.XXX.DSMgr.dsm.publish(SystemsEvent SystemsEvent)StackTrace:at XXX.XXX.DSMgr.dsm.publish(SystemsEvent SystemsEvent)对象引用未设置为对象的实例。为什么不提供dsm::publish的完整代码呢?有可能,您有一个。没有什么能让人猜测它在那个地方坠毁了。SystemsEvent对象更可能为null。部署.pdb以获取行号。你绝对确定这条线是罪魁祸首吗?@Lasse:不是100%,而是99%sure@jfs:这是我们仅有的:异常:System.NullReferenceException:对象引用未设置为对象的实例。at XXX.XXX.DSMgr.dsm.publish(SystemsEvent SystemsEvent)StackTrace:at XXX.XXX.DSMgr.dsm.publish(SystemsEvent SystemsEvent)对象引用未设置为对象的实例。为什么不提供dsm::publish的完整代码呢?有可能,您有一个。没有什么能让人猜测它在那个地方坠毁了。SystemsEvent对象更可能为null。部署.pdbs以获取行号。如果发生在HandleSaveStatus方法中,则应从另一个位置引发异常。OP显示“我认为”它位于QueueUserWorkItem行。但是,您可以在该行上传递null作为参数,因此除非ThreadPool为null,否则“think”是错误的。工作项进入队列并在执行时出错。让我们看看HandleSaveStatus的主体,看看是否在不检查null的情况下使用了该参数。对不起,您是OP。我今天感觉不太好。不管怎样,你说“我想”,但如果没有堆栈轨迹,最好确认一下。将以下内容粘贴到新的WinForms应用程序中,生成并运行它(不在调试中)。你会得到类似的车祸报告。私有void Form1_Load(对象发送方,事件参数e){ThreadPool.QueueUserWorkItem(HandleSaveStatus,null);}公共void HandleSaveStatus(对象状态){MessageBox.Show(state.ToString());}如果发生在HandleSaveStatus方法中,异常应该从另一个位置抛出。OP说“我想”它在QueueUserWorkItem行。但是,您可以在该行上传递null作为参数,因此除非ThreadPool为null,否则“think”是错误的。工作项进入队列并在执行时出错。让我们看看HandleSaveStatus的主体,看看是否在不检查null的情况下使用了该参数。对不起,您是OP。我今天感觉不太好。不管怎样,你说“我想”,但如果没有堆栈轨迹,最好确认一下。将以下内容粘贴到新的WinForms应用程序中,生成并运行它(不在调试中)。你会得到类似的车祸报告。private void Form1_Load(object sender,EventArgs e){ThreadPool.QueueUserWorkItem(HandleSaveStatus,null);}public void HandleSaveStatus(object state){MessageBox.Show(state.ToString());}在本例中,HandleSaveStatus