为什么我的代码忽略了一个真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。
请帮忙好吗?
很可能
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在单独的变量