tentar chamar um valor nulo (campo, global, método): como corrigir
Obtendo 'attempt to call a nil value' no FiveM? O que as variantes de campo, global e método significam, e como corrigir um erro de digitação, um export faltando ou um erro de dois pontos versus ponto.
No console:
SCRIPT ERROR: @my_script/server/main.lua:42: attempt to call a nil value (field 'GetPlayerFromId')
SCRIPT ERROR: @my_script/client/main.lua:17: attempt to call a nil value (global 'DrawText3D')
SCRIPT ERROR: @my_script/client/main.lua:63: attempt to call a nil value (method 'Notify')Lua está dizendo que uma linha tentou executar uma função que não existe. Este artigo explica as três variantes, as causas usuais, e como corrigir cada uma.
O que o erro significa
Em Lua um nome faltando não é um erro por si só: lê-lo dá nil. O erro só aparece quando você coloca colchetes depois dele, porque você não consegue executar nil. O texto entre colchetes diz como o script alcançou a função faltando:
attempt to call a nil value (global 'X'): uma chamada simples comoX(). A função não é definida em lugar nenhum que o script possa ver.attempt to call a nil value (field 'X'): uma chamada através de uma tabela comoESX.X()ouQBCore.Functions.X(). A tabela existe, mas não tem entrada nomeadaX.attempt to call a nil value (method 'X'): uma chamada com dois pontos comoobj:X(). O objeto existe, mas não tem métodoX.
O arquivo e linha na frente da mensagem (@my_script/server/main.lua:42) é a linha que faz a chamada. Se você não tiver certeza de como ler o resto da saída, veja como ler um erro de script FiveM.
1. Um erro de digitação no nome
Lua é sensível a maiúsculas/minúsculas. GetPlayerFromId e getPlayerFromId são dois nomes diferentes, assim como TriggerClientEvent e TriggerclientEvent. Compare o nome no erro com a documentação do framework, letra por letra.
2. A função não existe em sua versão
Frameworks renomeiam e removem funções. Esta é a causa mais comum em scripts que foram escritos para outra versão de seu framework.
-- an old call that may be gone on your version
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.getInventoryItem('bread')Verifique o que seu framework realmente oferece. Imprima a tabela para ver suas entradas:
for name, value in pairs(ESX) do
print(name, type(value))
endSe a função que você precisa não está na lista, o script e o framework não correspondem. Atualize o framework, atualize o script, ou substitua a chamada pela que sua versão tem.
3. O export está faltando
Exports são funções que outro recurso fornece. Quando o recurso é parado, falha em iniciar, ou não exporta aquele nome, a chamada falha.
local core = exports['qb-core']:GetCoreObject()
core.Functions.GetPlayer(source)Se o recurso não está em execução, FiveM imprime No such export em vez disso. Se ele é executado mas o nome de export está errado, você pode acabar com um campo nil. Inicie o recurso primeiro em server.cfg, e verifique os nomes de export exatos em sua documentação ou fxmanifest.lua. Duas correções relacionadas: ESX é nulo e Nenhum export getSharedObject.
4. Dois pontos versus ponto
Um dois pontos passa o objeto como um primeiro argumento oculto. Um ponto não. Misturá-los oferece este erro ou argumentos errados.
-- calls the method with the object as first argument
player:Notify('hello')
-- calls a plain function stored in a table
Utils.Notify('hello')Se o erro diz (method 'Notify'), o objeto não tem entrada Notify: use a forma de ponto se a função reside na tabela da biblioteca, ou verifique se o objeto realmente é o que você pensa que é. Com ox_lib, por exemplo, lib.notify({...}) é uma chamada de ponto na tabela lib.
5. A função é definida depois ou em outro arquivo
Uma função local deve ser definida antes da linha que a chama, no mesmo arquivo. Uma função definida em outro arquivo é apenas visível se for global, e apenas se esse arquivo for carregado pelo mesmo lado (cliente ou servidor) do mesmo recurso.
-- fails: DoThing is defined below the call
DoThing()
local function DoThing()
print('hi')
endMova a definição acima da chamada, ou declare-a primeiro com local DoThing e atribua depois. Verifique também fxmanifest.lua: um arquivo que não está listado em client_scripts, server_scripts ou shared_scripts nunca carrega, portanto suas funções nunca existem.
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }
shared_scripts { '@ox_lib/init.lua', 'config.lua' }6. Uma função de cliente usada no servidor, ou vice-versa
Muitos natives e funções de framework existem apenas em um lado. PlayerPedId é apenas de cliente, e GetPlayerIdentifiers é apenas de servidor. Tabelas de framework também diferem: ESX.GetPlayerFromId é uma função de servidor, enquanto o cliente usa ESX.GetPlayerData. Um script que é executado em shared_scripts é executado em ambos os lados, portanto uma chamada que funciona em um lado trava no outro.
Dica: o teste mais rápido é um print logo antes da linha falhando:
print(type(ESX.GetPlayerFromId)). Se ele imprimenil, a função está faltando. Se ele imprimefunction, o problema real está em outro lugar.
Guarde enquanto você depura
Verifique antes de chamar, para obter uma mensagem clara em vez de um crash:
local fn = ESX.GetPlayerFromId
if type(fn) ~= 'function' then
print('GetPlayerFromId is missing: check the ESX version')
return
endNão deixe guardas como este no lugar como a correção. Eles ocultam o problema real, que é um script e um framework que não correspondem.
Checklist
| Sintoma | Correção |
|---|---|
(global 'X') |
A função não é definida no arquivo ou nunca carregada: verifique o manifest e a ordem de definição |
(field 'X') |
A tabela não tem tal entrada: verifique a ortografia e a versão do framework |
(method 'X') |
Objeto errado ou dois pontos usados em vez de ponto: verifique o que a variável contém |
| Funciona em um lado apenas | A função existe apenas no cliente ou apenas no servidor |
| Erro após uma atualização do framework | Substitua a função removida pela nova, ou atualize o script |
| Chamada de export retorna nil | Inicie o recurso fornecedor primeiro e verifique o nome de export |
Respostas rápidas
O que significa 'attempt to call a nil value'?
O script tentou executar algo como uma função, mas o nome contém nil, portanto não há nada para executar. O nome dentro dos colchetes diz qual função está faltando.
Qual é a diferença entre campo, global e método neste erro?
Um global é um nome simples como Foo(), um campo é uma entrada de tabela como Config.Foo() ou ESX.Foo(), e um método é uma chamada com um dois pontos como obj:Foo(). Ele apenas diz como a função faltante foi alcançada.
Uma versão de framework errada pode causá-la?
Sim. Um script escrito para um ESX, QBCore ou QBox antigo ou novo pode chamar uma função que sua versão renomeou ou removeu, deixando nil para trás.
Scripts sem esse problema
Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →
Quest CreatorUm editor visual de missões e diálogos com NPCs, montado nó por nó dentro do jogo.Ver script →
Item Creator V2Crie itens usáveis com animações, props, efeitos e muito mais — sem escrever código.Ver script →