是否有修复本地用户空值的方法

这是一份我一直在修改的电话脚本,我试图更新一些代码,但一直出错。

Error @phone/server.lua:37: attempt to index a nil value (local 'user')
 ref (@phone/server.lua:37)
 handler (@framework/server/main.lua:242)
 getNumberPhone (@phone/server.lua:36)
 handler (@phone/server.lua:268)

我尝试了之前在这里学到的一种方法,但没有成功。

第37行

function getNumberPhone(source, n)
    local n = 0
    TriggerEvent('f:getPlayer', source, function(user)
        n = user.getPhoneNumber()
    end)
    return n
end

第242行

AddEventHandler("f:getPlayer", function(user, cb)
    if not cb then return end
    if(Users)then
        if(Users[user])then
            cb(Users[user])
        else
            cb(nil)
        end
    else
        cb(nil)
    end
end)

第36行

function getNumberPhone(source, n)
    local n = 0
    TriggerEvent('f:getPlayer', source, function(user)
        n = user.getPhoneNumber()
    end)
    return n
end

第286行

RegisterServerEvent('gcPhone:allUpdate')
AddEventHandler('gcPhone:allUpdate', function()
    local source = source
    local identifier = GetPlayerIdentifiers(source)[1]
    TriggerClientEvent("gcPhone:myPhoneNumber", source, getNumberPhone(source))
    TriggerClientEvent("gcPhone:allMessage", source, getMessages(identifier,source))
    TriggerClientEvent("gcPhone:contactList", source, getContacts(identifier))
end)
点赞
用户3902590
用户3902590

解释错误

在 Lua 中,这是你可能遇到的最常见的错误之一,因此你需要掌握如何解决它。

错误信息:attempt to index a nil value(试图对空值进行索引)

要理解此错误的含义,您只需要了解以下几个概念即可:

  • 在 Lua 中,只有表可以进行索引操作(例如 myTable[myIndex]
  • 在 Lua 中,如果一个变量评估为 nil,那么尝试将其索引为表会抛出错误

因此,您应该更容易理解您收到的错误。更明确地描述此错误的方式可能是“Lua 解释器尝试在第 37 行对变量 user 进行索引,但 user 的值为 nil”。

您的特定情况

在第 242 行,您调用了一个回调并传递了 nil

cb(nil)

此回调将此 nil 值作为 user 参数发送到第 37 行:

TriggerEvent('f:getPlayer', source, function(user)
    n = user.getPhoneNumber()
end)

因此,当您尝试运行 user.getPhoneNumber() 时,实际上是运行了 nil.getPhoneNumber(),这就是您看到的错误。

修正此类型的错误的方法

1)每当您使用可能为 nil 的变量时,请创建一个 if 语句,检查它是否为 nil,然后再执行其他操作。

2)确保您永远不要将该变量设置为 nil

修复您的特定错误的方法

1)在第 36 行创建如下 if 语句

TriggerEvent('f:getPlayer', source, function(user)
    if user ~= nil then
        n = user.getPhoneNumber()
    end
end)

或者执行类似以下的 nil 检查

TriggerEvent('f:getPlayer', source, function(user)
    if user then
        n = user.getPhoneNumber()
    end
end)

2)始终在回调中传递一个用户。例如,在第 242 行和其他地方,传递一个真正的用户对象:

cb(Users[someUser])
2019-10-02 14:23:32