【问题标题】:c# reports an object as null when it isn'tc# 当一个对象不是 null 时,它会报告它为 null
【发布时间】:2012-05-01 17:44:48
【问题描述】:

当我在调试模式下运行我的程序时,它会在一个非 null 的对象上弹出 NullReferenceException - 它按照 Locals 视图中的定义显示。有问题的对象是 SFML.Graphics.Sprite,其中只有一个字段为空(myInverseTransform),但是当我检查其他 Sprite 时,它​​们在那里也为空。

有谁知道是什么原因造成的,或者我怎样才能找到异常所指的空对象是什么?

this is the picture of it

相关代码:

代码如下:

(在雪碧中:)

public void Draw(RenderTarget target, RenderStates states)

{

    states.Transform *= Transform;

    RenderStates.MarshalData marshaledStates = states.Marshal();

            if (target is RenderWindow)
            {
                sfRenderWindow_drawSprite(((RenderWindow)target).CPointer, CPointer, ref marshaledStates);
            }
            else if (target is RenderTexture)
            {
                sfRenderTexture_drawSprite(((RenderTexture)target).CPointer, CPointer, ref marshaledStates);
            }
        }

(在变换中:)

        public static Transform operator *(Transform left, Transform right)
        {
            return new Transform(left).Combine(right);
        }

        public Transform Combine(Transform transform)
        {
            sfTransform_combine(CPointer, transform.CPointer);
            return this;
        }
            else if (target is RenderTexture)
            {
                sfRenderTexture_drawSprite(((RenderTexture)target).CPointer, CPointer, ref marshaledStates);
            }
        }

调用Sprite.Draw时this.Transform被定义(根据Locals视图),但是在Transform的*操作符中右边变量为null的问题;

【问题讨论】:

  • 显示你的代码,问题可能与局部和全局变量有关
  • 看起来 SFML 中存在某种缺陷 - 正在内部访问一个空变量,它只是没有更深入地向您展示,因为它无法访问 SFML 的源代码。跨度>
  • 我更深入地研究了 Draw,但我得到的是在内部调用 (Sprite.Draw) 中有一行写着 states.Transform *= Transform,在 * 运算符中它说对Transform为null,但在Sprite.Draw中this.Transform不为null,所以还是同一个问题。

标签: c# visual-studio-2010 nullreferenceexception sfml


【解决方案1】:

您很可能会发现问题出在 Draw() 方法中,其中有东西试图访问空变量的成员 - 它甚至可能是方法中的局部变量。

您可以尝试自己编译 SFML(它是开源的吗?)并使用该副本来查看到底出了什么问题。

【讨论】:

    【解决方案2】:

    这并不是说您的变量值为空。 (object 不能为 null - variable 可以有 null 值。有很大的不同。)这只是说发生了 NullReferenceException。例如,它可能是 SFML 库中的错误。您应该查看堆栈跟踪以找出异常被抛出的确切位置,然后从那里开始。

    【讨论】:

    • 嗯,C#中的所有变量对象不都是?
    • @MrLister:不。这里有不同的概念 - 变量、它的(在这种情况下是一个参考)和一个object(值所指的对象)。非常值得区分它们。 “一张写有我地址的纸”与“我的地址”不同,“我的地址”与“我的房子”不同。
    • 查看我刚刚添加的问题的评论。我更深入了,这是一个非空变量作为空值传递的情况。
    • @nihohit:好的,但不是你在谈论我们看不到的代码,在我们看不到的情况下。如果没有更多信息,我们真的无法为您提供帮助。您可能没有真的传递您认为的变量(例如,由于局部变量隐藏了实例变量),但没有代码就很难说。
    • @nihohit:您提供的代码甚至无法编译 - 您的 Combine 方法在 else 部分之前完成。
    猜你喜欢
    • 2020-02-09
    • 2019-07-22
    • 2011-04-18
    • 2016-06-19
    • 2015-07-17
    • 2023-03-20
    • 2018-12-27
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多