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