Исключение SkeletonStream NullReferenceException не было обработано

Я пытаюсь получить положения X, Y, Z скелетных суставов с помощью двух датчиков Kinect. Пока у меня есть одна простая форма с 2 кнопками и 6 ярлыками. При нажатии на первую кнопку я хотел бы показать позиции x, y, z правой руки в label1,2,3. То же самое я хотел бы сделать со второй кнопкой, но со вторым устройством kinect.

Он хорошо работал с одним Kinect, но когда я добавил код для второго Kinect, было сгенерировано исключение NullReferenceException. Может кто-нибудь, пожалуйста, скажите мне, что я не так? Спасибо.

РЕДАКТИРОВАТЬ:

Окно просмотра:

датчик.СкелетныйПоток.Включить(); 'sensor.SkeletonStream' имеет значение null

Сообщение об исключении: ссылка на объект не указывает на экземпляр объекта.

КОД

public partial class Form1 : Form
{

     Skeleton[] skeletons;
     Skeleton[] skeletons2;

    public Form1()
    {
        InitializeComponent();
        // First Kinect Device
        KinectSensor sensor = KinectSensor.KinectSensors[0];
        sensor.SkeletonStream.Enable();  // Here is the exception thrown
        sensor.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(SensorSkeletonFrameReady);
        sensor.Start();

        // Second Kinect Device
        KinectSensor sensor2 = KinectSensor.KinectSensors[1];
        sensor2.SkeletonStream.Enable();
        sensor2.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(SensorSkeletonFrameReady2);
        sensor2.Start();


    }


    private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
    {
        skeletons = new Skeleton[0];

        using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
        {
            if (skeletonFrame != null)
            {
                skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
                skeletonFrame.CopySkeletonDataTo(skeletons);
            }
        }

    }

    private void SensorSkeletonFrameReady2(object sender, SkeletonFrameReadyEventArgs e)
    {
        skeletons2 = new Skeleton[0];

        using (SkeletonFrame skeletonFrame2 = e.OpenSkeletonFrame())
        {
            if (skeletonFrame2 != null)
            {
                skeletons2 = new Skeleton[skeletonFrame2.SkeletonArrayLength];
                skeletonFrame2.CopySkeletonDataTo(skeletons2);
            }
        }

    }

    private void button1_Click(object sender, EventArgs e)
    {
        foreach(Skeleton skeleton in skeletons) 
        {
            // get the joint
            Joint rightHand = skeleton.Joints[JointType.HandRight];

            // get the individual points of the right hand
            double rightX = rightHand.Position.X;
            double rightY = rightHand.Position.Y;
            double rightZ = rightHand.Position.Z;

            label1.Text = rightX.ToString();
            label2.Text = rightY.ToString();
            label3.Text = rightZ.ToString();
        }



    }

    private void button2_Click(object sender, EventArgs e)
    {
        foreach (Skeleton skeleton in skeletons2)
        {
            // get the joint
            Joint rightHand = skeleton.Joints[JointType.HandRight];

            // get the individual points of the right hand
            double rightX = rightHand.Position.X;
            double rightY = rightHand.Position.Y;
            double rightZ = rightHand.Position.Z;

            label4.Text = rightX.ToString();
            label5.Text = rightY.ToString();
            label6.Text = rightZ.ToString();
        }
    }



}

person user2179427    schedule 06.06.2014    source источник
comment
Как насчет стека вызовов и полного сообщения об исключении?   -  person Samuel    schedule 06.06.2014
comment
@ Самуэль, я отредактировал свой вопрос   -  person user2179427    schedule 06.06.2014
comment
возможный дубликат Что такое NullReferenceException и как его исправить это?   -  person Daniel Kelley    schedule 06.06.2014


Ответы (1)


Это потому, что ваш объект sensor имеет значение null. Чтобы исправить это, вы должны проверить, не имеет ли ваш датчик значение null раньше. Это можно легко сделать следующим образом:

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();
}

В наборе инструментов разработчика также есть отличные примеры того, как перебрать все доступные датчики и выбрать первый ненулевой.

В C# 6.0 будет оператор безопасной навигации именно для этой цели!

sensor?.SkeletonStream.Enable();
person Liam McInroy    schedule 06.06.2014
comment
К сожалению, это не работает. Исключение NullReference остается на той же строке. В нем говорится, что: ссылка на объект не указывает на экземпляр объекта. Окно просмотра: sensor.SkeletonStream.Enable() Это выражение вызывает побочные эффекты и не будет оцениваться. - person user2179427; 09.06.2014
comment
@user2179427 user2179427 Значит, sensor по-прежнему равно нулю? - person Liam McInroy; 09.06.2014
comment
да это так. Я обнаружил, что когда я отключаю второе устройство kinect, ошибка исчезает. Но я должен закомментировать этот фрагмент кода для второго устройства (KinectSensor sensor2 = KinectSensor.KinectSensors[1]; и т. д.). И теперь я не знаю, как подключить оба устройства к своему ПК, чтобы он работал. - person user2179427; 10.06.2014
comment
@ user2179427 Отлично! Вы можете ответить и принять свой вопрос, чтобы помочь людям с такой же ошибкой в ​​будущем. - person Liam McInroy; 10.06.2014