C# SkeletonStream NullReferenceException未处理

C# SkeletonStream NullReferenceException未处理,c#,kinect,kinect-sdk,C#,Kinect,Kinect Sdk,我试图从2个Kinect传感器获取骨骼关节的X、Y、Z位置。到目前为止,我有一个简单的表单,有2个按钮和6个标签。单击第一个按钮,我想在label1、2、3中显示右手的x、y、z位置。同样,我想做第二个按钮,但第二个kinect设备 它在一个Kinect上运行得很好,但是当我为第二个Kinect添加代码时,引发了NullReferenceException。谁能告诉我我做错了什么? 多谢各位 编辑: 观察窗口: sensor.SkeletonStream.Enable();'sensor.Ske

我试图从2个Kinect传感器获取骨骼关节的X、Y、Z位置。到目前为止,我有一个简单的表单,有2个按钮和6个标签。单击第一个按钮,我想在label1、2、3中显示右手的x、y、z位置。同样,我想做第二个按钮,但第二个kinect设备

它在一个Kinect上运行得很好,但是当我为第二个Kinect添加代码时,引发了NullReferenceException。谁能告诉我我做错了什么? 多谢各位

编辑:

观察窗口:

sensor.SkeletonStream.Enable();'sensor.SkeletonStream'为空

异常消息:对象引用未设置为对象的实例

代码

公共部分类表单1:表单
{
骨架[]骨架;
骨架[]骨架2;
公共表格1()
{
初始化组件();
//第一个Kinect设备
Kinect传感器=Kinect传感器。Kinect传感器[0];
sensor.SkeletonStream.Enable();//下面是引发的异常
sensor.SkeletonFrameReady+=新事件处理程序(SensorSkeletonFrameReady);
sensor.Start();
//第二Kinect装置
KinectSensor Sensor 2=KinectSensor.KinectSensors[1];
sensor2.SkeletonStream.Enable();
sensor2.SkeletonFrameReady+=新事件处理程序(SensorSkeletonFrameReady2);
传感器2.启动();
}
专用void传感器SkeletonFrameReady(对象发送器,SkeletonFrameReadyEventArgs e)
{
骨架=新骨架[0];
使用(SkeletonFrame SkeletonFrame=e.OpenSkeletonFrame())
{
如果(skeletonFrame!=null)
{
skeletons=新骨架[skeletonFrame.SkeletonArrayleLength];
skeletonFrame.CopySkeletonDataTo(骨架);
}
}
}
专用void传感器SkeletonFrameReady2(对象发送器,SkeletonFrameReadyEventArgs e)
{
skeletons2=新骨架[0];
使用(SkeletonFrame skeletonFrame2=e.OpenSkeletonFrame())
{
如果(skeletonFrame2!=null)
{
skeletons2=新骨架[skeletonFrame2.SkeletonArrayLength];
skeletonFrame2.CopySkeletonDataTo(skeletons2);
}
}
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
foreach(骨架中的骨架)
{
//拿到接头
Joint rightHand=skeleton.Joints[JointType.HandRight];
//获得右手的各个点
double rightX=右手位置.X;
双右Y=右手位置Y;
double rightZ=右手位置Z;
label1.Text=rightX.ToString();
label2.Text=rightY.ToString();
label3.Text=rightZ.ToString();
}
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
foreach(骨架中的骨架2)
{
//拿到接头
Joint rightHand=skeleton.Joints[JointType.HandRight];
//获得右手的各个点
double rightX=右手位置.X;
双右Y=右手位置Y;
double rightZ=右手位置Z;
label4.Text=rightX.ToString();
label5.Text=rightY.ToString();
label6.Text=rightZ.ToString();
}
}
}

这是因为您的
传感器
对象为空。要修复此问题,您应该在安装前检查传感器是否为空。这样做很容易:

KinectSensor sensor = KinectSensor.KinectSensors[0];
if (sensor != null)
{
    sensor.SkeletonStream.Enable();  // Here is the exception not thrown:)
    sensor.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(SensorSkeletonFrameReady);
    sensor.Start();
}

调用堆栈和完整异常消息呢?@Samuel我已经编辑了我的问题,很遗憾,这可能是重复的,但不起作用。NullReference异常保持在同一行上。它说:对象引用未设置为对象的实例。和监视窗口:sensor.SkeletonStream.Enable()此表达式会产生副作用,不会被忽略eval@user2179427所以传感器仍然为空?是的。我发现,当我断开第二个kinect设备时,错误消失了。但是我必须注释掉第二个设备的那段代码(kinectsensor2=KinectSensor.KinectSensors[1];等等)。现在我不知道如何将这两个设备都插入我的电脑,这样它就可以工作了。@user2179427太棒了!你可以回答并接受你自己的问题,以帮助将来犯同样错误的人
KinectSensor sensor = KinectSensor.KinectSensors[0];
if (sensor != null)
{
    sensor.SkeletonStream.Enable();  // Here is the exception not thrown:)
    sensor.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(SensorSkeletonFrameReady);
    sensor.Start();
}
sensor?.SkeletonStream.Enable();