偶尔会出现随机错误:试图将 nil 与数字进行比较,这是 Corona SDK 的错误。

我的应用程序偶尔会抛出以下错误:

gamePlay.lua:121: attempt to compare nil with number

该函数将对象从屏幕右侧移动到左侧。当它移出50像素时,对象应该被移除。以下是该方法的代码:

function moveObject(self,event)

        if (self.x)<-50 then --这是第121行
            --remove object
            Runtime:removeEventListener("enterFrame", event.self)
            display.remove(event.target)

        else
            self.x = self.x-self.speed --以值速度向左移动对象
        end
    end

当调用此方法并转到重新启动屏幕时,会弹出错误:

------当球撞到另一个对象时,转到重新启动场景------------

    local function onCollision( self,event )

        if(event.object2.name == "bonus")then--如果我们击中奖励球
            event.object2:removeSelf()

            --set score
            local currentScore =game.returnScore()
            game.setScore(currentScore*2)
            scoreText.text = game.returnScore()

            Runtime:removeEventListener("enterFrame", event.object2)

        else

            composer.gotoScene("restart")
            Runtime:removeEventListener("touch", onObjectTouch)
        end
    end
    ball.collision = onCollision
    Runtime:addEventListener( "collision", ball )

有什么想法可能会发生什么?这种错误很少发生,可能是每15次中的1次。

点赞
用户2305605
用户2305605

我认为这与您的事件侦听器有关。我有时会发现在场景更改后,Corona 仍然会运行事件侦听器。我猜球在事件侦听器停止之前已经被清除(删除),而有时侦听器仍然在清理之前运行。

要解决此问题,您可以尝试:

  1. 先删除侦听器,再删除球

  2. 在 if 检查之前简单地添加一个 null 检查

    if (self ~= null) then
    if (self.x)<-50 then --这是第 121 行
            --删除对象
            Runtime:removeEventListener("enterFrame", event.self)
            display.remove(event.target)
    
2016-01-17 23:46:53
用户148569
用户148569

我曾经通过不仅仅检查 "self" 是否为空,而且还要检查 "self.x" 是否为空来解决类似的问题。所以...

如果 self ~= nil 并且 self.x ~= nil 并且 self.x < -50 然后

我不是完全确定为什么这样可以,但我猜测 corona 是删除了显示对象的属性而不是对象本身。

2016-01-30 18:12:38