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

本文关键字:一个 条件 if 代码 我的 为什么 | 更新日期: 2023-09-27 18:06:18

我有以下代码:

    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是空的。为了避免在for循环中引起NullReferenceException,我决定检查它是否为空,如果是,则提前结束函数,但是它似乎完全忽略了if条件,即使返回的对象为空。我在返回语句上设置了一个断点,但代码从未到达那里,而是触发了我试图避免的NullReferenceException。

请帮忙好吗?

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

很可能

TileMap.GetMapSquareAtPixel(collisionCenter)

不为空,但是

TileMap.GetMapSquareAtPixel(collisionCenter).Codes

。如果是这样,那么

TileMap.GetMapSquareAtPixel(collisionCenter).Codes.Count

将以NullReferenceException失败。

你需要把它添加到你的保护条件:

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

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

如果。codes部分为空,也检查一下!

两种情况下函数的返回值是否会发生变化?

尝试分配给一个局部变量并进行检查(并与调试器一起逐步完成)

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被抛出时,它试图得到哪个变量?

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

如果你调用的方法正在改变状态(通常getter 不应该这样做),那么它可能不是幂等调用,这意味着多次调用是不安全的。

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

我建议尝试存储TileMap的值。GetMapSquareAtPixel在单独的变量