l'index de table est nil / indexer une valeur nil (field) : correction FiveM Lua
Corrigez « table index is nil » et « attempt to index a nil value (field x) » dans Lua FiveM : clés de config manquantes, affectations t[nil], tables imbriquées et patterns d'accès sûrs.
Deux erreurs qui se ressemblent reviennent tout le temps dans les scripts FiveM :
SCRIPT ERROR: @my_script/server/main.lua:42: table index is nil
SCRIPT ERROR: @my_script/client/main.lua:19: attempt to index a nil value (field 'shops')Elles signifient des choses différentes. La première concerne une clé nil, la seconde concerne une table nil. Les deux reviennent à une valeur que votre code attendait et n'a pas trouvée. Ce guide montre comment les distinguer et comment écrire l'accès pour qu'il ne puisse pas crasher.
table index is nil
Vous avez assigné à une table, et la clé était nil :
local cache = {}
local function remember(identifier, data)
cache[identifier] = data -- table index is nil when identifier is nil
endLua permet n'importe quelle valeur comme clé sauf nil (et NaN). Lire cache[nil] donne juste nil, mais écrire dedans lève l'erreur.
Trouvez quelle variable entre les crochets est nil sur cette ligne. Les sources habituelles :
- Une recherche de joueur qui n'a rien retourné.
GetPlayerIdentifierByType(source, 'license')retournenilquand le joueur n'a pas d'identifiant de ce type, par exemple quand le joueur n'est pas connecté via la plateforme que vous attendez. - Un
sourcefaux. Sur le serveur, vérifiez que l'événement vient réellement d'un joueur. Un appel de la console n'a pas de joueur derrière. - Un champ manquant dans les données :
data.idest nil car l'expéditeur a utilisédata.Id.
Imprimez-le pour être sûr :
print('identifier', identifier, type(identifier))Ensuite, arrêtez l'affectation quand la clé manque, et décidez si c'est une erreur ou un cas normal :
local function remember(identifier, data)
if not identifier then
return print('remember: no identifier, skipping')
end
cache[identifier] = data
endattempt to index a nil value (field 'x')
attempt to index a nil value (field 'shops')Ici la table manque. Le nom entre crochets est le field qui était nil, et la chose que vous l'avez indexée est sur la ligne :
local first = Config.shops[1] -- Config.shops is nil, so [1] failsLua nomme ce qu'il connaît. Quelques formes que vous verrez :
| Message | Signification |
|---|---|
(global 'Config') |
La variable globale Config est nil |
(local 'data') |
Une variable locale est nil, souvent un argument de fonction |
(field 'shops') |
Config.shops est nil |
(field '?') |
Une table trouvée par une clé variable, comme Config.Shops[id], est nil |
(upvalue 'cache') |
Une variable d'une portée externe est nil |
Pour field '?', Lua ne peut pas nommer la clé car elle est calculée :
Config.Shops[id].label -- attempt to index a nil value (field '?')Le correctif est le même : trouvez quelle étape de la chaîne est nil. Imprimez chaque étape :
print(Config)
print(Config.Shops)
print(Config.Shops[id])Tables de config imbriquées
La plupart de ces erreurs viennent de fichiers de config :
Config = {}
Config.Shops = {
bar = { label = 'Bar', items = { 'beer', 'water' } },
}
-- somewhere else
local items = Config.Shops[shopName].itemsSi shopName est 'Bar' au lieu de 'bar', Config.Shops[shopName] est nil et le prochain .items crashe. Causes à vérifier :
- Orthographe ou casse différente. Les clés Lua sont sensibles à la casse.
- Le fichier de config n'est pas chargé. Il doit être dans
shared_scripts(ou la liste du bon côté) defxmanifest.lua, avant le fichier qui le lit. - La config est définie d'un côté uniquement. Un fichier listé sous
server_scriptsest invisible au client. - Une clé numérique contre une clé de chaîne.
Config.Shops[1]etConfig.Shops['1']sont des entrées différentes. Cela se produit souvent après que les données traversent JSON, voir erreurs FiveM json.decode.
-- fxmanifest.lua
shared_scripts { 'config.lua' }
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }Patterns d'accès sûr
Quand une valeur manquante est un cas normal, écrivez l'accès pour qu'il la traite.
Vérifiez chaque étape avec and :
local shop = Config.Shops and Config.Shops[shopName]
if not shop then
return print(('Unknown shop: %s'):format(tostring(shopName)))
end
print(shop.label)Utilisez or pour une valeur par défaut :
local items = (shop and shop.items) or {}
local radius = Config.Radius or 5.0Faites un petit helper quand vous lisez les chemins profonds souvent :
local function get(t, ...)
for _, key in ipairs({ ... }) do
if type(t) ~= 'table' then return nil end
t = t[key]
end
return t
end
local label = get(Config, 'Shops', shopName, 'label')Attention : ne cachez pas chaque nil avec
or {}. Si une table qui doit exister manque, c'est un bug dans la config ou l'ordre de chargement, et une fallback discrète ne déplace l'erreur que quelque part de moins évident. Utilisez des gardes pour les valeurs qui peuvent légitimement être absentes.
Dump une table pour voir ce qu'elle contient
Quand vous n'êtes pas sûr de ce qu'une table détient, imprimez-la comme JSON :
print(json.encode(Config.Shops, { indent = true }))Vous verrez les vraies clés et repérerez une faute de frappe, une casse différente ou un nombre où vous attendiez une chaîne. Faites-le au point où l'erreur se produit, pas au début du fichier, car les données peuvent être remplies plus tard.
Liste de contrôle
| Symptôme | Correction |
|---|---|
table index is nil |
La clé en t[key] = value est nil ; imprimez-la et retournez tôt si elle manque |
attempt to index a nil value (field 'shops') |
Le field nommé n'est pas défini dans la table avant ; vérifiez le nom et l'orthographe |
attempt to index a nil value (field '?') |
Une recherche avec une clé variable n'a rien trouvé ; vérifiez la clé et sa casse |
| Fonctionne sur le serveur, nil sur le client | La config n'est pas dans shared_scripts |
| Le fichier de config ignoré | Listez-le avant les fichiers qui l'utilisent |
| Clé de nombre vs clé de chaîne | [1] et ['1'] diffèrent ; convertissez avec tonumber ou tostring |
Pour les autres messages nil courants, voir tentative de comparer nil et erreurs de mauvais argument.
Réponses rapides
Que signifie « table index is nil » ?
Le script a essayé d'écrire dans une table en utilisant nil comme clé, comme t[key] = value quand key est nil. Lua ne permet pas nil comme clé, il s'arrête donc.
Quelle est la différence entre « table index is nil » et « attempt to index a nil value » ?
En « table index is nil » la clé est nil. En « attempt to index a nil value » la table elle-même est nil, donc il n'y a rien à lire ou écrire.
Pourquoi l'erreur dit-elle field '?' au lieu d'un nom ?
Quand la clé est une variable comme Config.Shops[id], Lua ne peut pas la nommer. Cela montre ?. Regardez la ligne et trouvez quelle partie de la chaîne est nil.
Des scripts sans ce problème
Shop CreatorCréez un magasin en moins d’une minute — propriétaires, employés, coffres et braquages inclus.Voir le script →
Quest CreatorUn éditeur visuel de quêtes et de dialogues PNJ, construit nœud par nœud en jeu.Voir le script →
Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →