为什么我的代码忽略了一个真正的if条件?

时间:2011-08-20 21:02:10

标签: c#

我有以下代码:

    private static void checkCodesInPlayerCenter(GameObject player)
    {
        Vector2 collisionCenter = player.GetCollisionCenter(player.PublicCollisionRectangle);

        if (TileMap.GetMapSquareAtPixel(collisionCenter) == null)
        {
            return;
        }

        for (int i = 0; i < TileMap.GetMapSquareAtPixel(collisionCenter).Codes.Count; ++i )

有时我从GetMapSquareAtPixel获取的对象可能为null。为了不在for循环中导致NullReferenceException,我决定检查它是否为null,如果是这样,那么早期结束该函数,但它似乎完全忽略if条件,即使返回的对象为null。 我在return语句中设置了一个断点,但代码永远不会去那里,而是触发我试图避免的NullReferenceException。

请帮忙吗?

5 个答案:

答案 0 :(得分:2)

很可能

TileMap.GetMapSquareAtPixel(collisionCenter)

不是null,而是

TileMap.GetMapSquareAtPixel(collisionCenter).Codes

是。如果是这样的话那么

TileMap.GetMapSquareAtPixel(collisionCenter).Codes.Count

将因NullReferenceException而失败。

您需要将其添加到您的警卫条件:

    if (TileMap.GetMapSquareAtPixel(collisionCenter) == null ||
        TileMap.GetMapSquareAtPixel(collisionCenter).Codes == null)
    {
        return;
    }

答案 1 :(得分:1)

如果函数返回两个不同的结果怎么办(不太可能,但不要两次调用这个可能的昂贵函数 - 将结果保存在变量中并检查/使用此变量)

如果.Codes部分为空怎么办 - 请检查一下!

答案 2 :(得分:0)

函数的返回值是否可能在两个条件之间发生变化?

尝试分配本地变量并进行检查(并使用调试器逐步完成)

private static void checkCodesInPlayerCenter(GameObject player)
{
    Vector2 collisionCenter = player.GetCollisionCenter(player.PublicCollisionRectangle);

    var squareAtPixel = TileMap.GetMapSquareAtPixel(collisionCenter);

    if (squareAtPixel  == null)
    {
        return;
    }

    for (int i = 0; i < squareAtPixel.Codes.Count; ++i )

如果GetMapSquareAtPixel调用很昂贵,那么这也可能更好(当你真正关心的是一个空检查时,一次调用vs两次调用)

编辑:当NRE被抛出时,它试图进入哪个变量?

答案 3 :(得分:0)

我强烈建议将TileMap.GetMapSquareAtPixel返回值分配给某个局部变量,然后检查它是否为null条件并在for循环中使用相同的var。

这样可行。

答案 4 :(得分:0)

如果你正在调用的方法是变异状态(通常是一个getter 不应该那么做),那么它可能不是一个幂等的调用,这意味着调用超过一次。

此外,在调试器中添加该表达式很可能导致在您进入代码之前对其进行评估,从而导致NPE。

我主张尝试将TileMap.GetMapSquareAtPixel的值存储在一个单独的变量中。