是否有可能在此行中有System.NullReferenceException?

时间:2011-04-08 17:01:23

标签: c# .net

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

Exception Message: System.NullReferenceException: Object reference not set to an instance of an object.

在这一行中,我认为:

ThreadPool.QueueUserWorkItem(HandleSaveStatus, (EvDoSaveStatus)systemSwEvent); 

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

            SystemSwEvent ev = new EvDoSaveStatus();
            ev = null;
            EvDoSaveStatus evt = (EvDoSaveStatus)ev;
            string str = "Is it good?";

没有抛出异常。这意味着即使(EvDoSaveStatus)systemSwEvent systemSwEvent某种方式null也会很好{/ 1}}。

如果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);
    }
}

2 个答案:

答案 0 :(得分:2)

ev = null;
EvDoSaveStatus evt = (EvDoSaveStatus)ev;

将导致evt为空。您可以将null作为QueueUserWorkItem的第二个参数传递,但是您排队的回调需要处理它。

HandleSaveStatus必须是WaitCallback,因此它需要一个对象参数。它试图用这个对象做什么?它是否处理它为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
}

答案 1 :(得分:2)

疯狂猜测......

根据documentation for QueueUserWorkItem,仅当第一个参数callback为空时,它才会抛出NullReferenceException。

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

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

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

显式构造函数调用(new WaitCallback)实际上比必要的更冗长,但它表明委托创建是另一个可能的NullReferenceExceptions源。