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 :

text
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 :

lua
local cache = {}

local function remember(identifier, data)
    cache[identifier] = data     -- table index is nil when identifier is nil
end

Lua 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') retourne nil quand 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 source faux. 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.id est nil car l'expéditeur a utilisé data.Id.

Imprimez-le pour être sûr :

lua
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 :

lua
local function remember(identifier, data)
    if not identifier then
        return print('remember: no identifier, skipping')
    end
    cache[identifier] = data
end

attempt to index a nil value (field 'x')

text
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 :

lua
local first = Config.shops[1]    -- Config.shops is nil, so [1] fails

Lua 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 :

lua
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 :

lua
print(Config)
print(Config.Shops)
print(Config.Shops[id])

Tables de config imbriquées

La plupart de ces erreurs viennent de fichiers de config :

lua
Config = {}
Config.Shops = {
    bar = { label = 'Bar', items = { 'beer', 'water' } },
}

-- somewhere else
local items = Config.Shops[shopName].items

Si shopName est 'Bar' au lieu de 'bar', Config.Shops[shopName] est nil et le prochain .items crashe. Causes à vérifier :

  1. Orthographe ou casse différente. Les clés Lua sont sensibles à la casse.
  2. Le fichier de config n'est pas chargé. Il doit être dans shared_scripts (ou la liste du bon côté) de fxmanifest.lua, avant le fichier qui le lit.
  3. La config est définie d'un côté uniquement. Un fichier listé sous server_scripts est invisible au client.
  4. Une clé numérique contre une clé de chaîne. Config.Shops[1] et Config.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.
lua
-- 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 :

lua
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 :

lua
local items = (shop and shop.items) or {}
local radius = Config.Radius or 5.0

Faites un petit helper quand vous lisez les chemins profonds souvent :

lua
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 :

lua
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 →

À lire aussi