【问题标题】:Kinect NullReferenceException errorKinect NullReferenceException 错误
【发布时间】:2011-11-29 22:49:12
【问题描述】:
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 类型的错误。

【问题讨论】:

  • 如果您使用 FirstOrDefault,则数据的 null 值是一种可能性。您应该在访问关节之前检查它

标签: c# visual-studio xna kinect


【解决方案1】:

如果没有与您的 where 子句匹配的值,FirstOrDefault() 将返回 null(假设 SkeletonData 是一个类) - 所以我怀疑是这种情况。

如果您的代码将依赖至少一个结果,最好调用First() 而不是FirstOrDefault,以避免隐藏错误。我个人也不会费心使用查询表达式:

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

或者,正如 cmets 中所指出的,使用带有谓词的 First 的重载:

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

【讨论】:

  • 甚至不需要 .Where 调用——您只需将 lambda 传递给 .First()
【解决方案2】:

您的数据变量可能为空。在该行设置断点并在本地监视窗口中查看。

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多