Ошибка Kinect NullReferenceException - PullRequest
       23

Ошибка Kinect NullReferenceException

2 голосов
/ 30 ноября 2011
void runtime_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
    SkeletonFrame skeletonSet = e.SkeletonFrame;

    SkeletonData data = (from s in skeletonSet.Skeletons
                         where s.TrackingState == SkeletonTrackingState.Tracked
                         select s).FirstOrDefault();

    var head = data.Joints[JointID.Head];
    var rightHand = data.Joints[JointID.HandRight];
    var leftHand = data.Joints[JointID.HandLeft];
    SetEllipsePosition(ellipseHead, head, false);
    SetEllipsePosition(ellipseLeftHand, leftHand, isBackGestureActive);
    SetEllipsePosition(ellipseRightHand, rightHand, isForwardGestureActive);

    ProcessForwardBackGesture(head, rightHand, leftHand);
}

Строка var head = data.Joints[JointsID.Head]; дает мне ошибку типа NullReferenceException.

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

Хорошо FirstOrDefault() вернет ноль (при условии, что SkeletonData - это класс), если нет значений, соответствующих вашему предложению where - поэтому я подозреваю, что это так.

Если ваш код собираетсяполагаться на наличие хотя бы одного результата, было бы лучше вызвать First(), а не FirstOrDefault, чтобы избежать сокрытия ошибки.Лично я бы не стал использовать выражение запроса:

SkeletonData data = skeletonSet.Skeletons
               .Where(s => s.TrackingState == SkeletonTrackingState.Tracked)
               .First();

Или, как указано в комментариях, использовать перегрузку First, которая принимает предикат:

SkeletonData data = skeletonSet.Skeletons
               .First(s => s.TrackingState == SkeletonTrackingState.Tracked);
2 голосов
/ 30 ноября 2011

Ваша переменная данных, вероятно, нулевая. Установите точку останова на этой линии и посмотрите на нее в окне локальных часов.

...