tentative d'indexer une valeur nil
Un script attendait qu'une information soit prête et elle ne l'était pas, alors il s'est arrêté.
Faites d'abord ceci
Notez le script et le fichier nommés par le message, et vérifiez s'il a démarré avant votre framework.
Ce que ça veut dire
Quelque chose a utilisé l'opérateur . ou [] sur une variable qui est nil. En Lua, a.b n'est légal que si a est une table ; quand a est nil, le script s'arrête sur cette ligne. Le message nomme en général ce qui était nil : (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').
Ce nom entre parenthèses est la partie la plus utile du message, et chaque type pointe ailleurs :
• global 'X' — jamais affecté, ou affecté dans un fichier qui n'a pas tourné.
• field 'X' — la table existe mais n'a pas cette clé.
• local 'X' / upvalue 'X' — affecté dans ce fichier, mais pas avant l'exécution de cette ligne.
Ce qui la provoque
Classé par fréquence : la cause la plus probable en premier.
- 1
L'objet du framework n'a pas encore chargé (le plus courant côté client)
Un fichier client lit
ESX,QBCoreouPlayerDataau niveau du fichier ou dans un thread précoce, avant que le framework n'ait remis l'objet joueur. Votre ressource démarre avant que le framework ait fini de charger le joueur. - 2
Une clé de config qui n'existe pas
Config.Something.valueoùConfig.Somethingn'a jamais été défini, a été renommé, ou vit dans un fichier absent du fxmanifest. - 3
Le serveur a envoyé nil
Un gestionnaire d'événement client indexe une table passée par le serveur, et sur un chemin le serveur n'a rien passé.
TriggerClientEvent('x', src)sans charge utile donne nil au gestionnaire. - 4
Un enrobage qui n'a rien renvoyé
Les natives ne renvoient pas de tables, mais un utilitaire autour de l'une d'elles peut renvoyer nil pour une entité invalide, et l'appelant indexe ça.
- 5
L'ordre de chargement
Le fichier qui définit la table est listé APRÈS celui qui l'utilise dans fxmanifest : au moment de l'usage, elle n'existe pas encore.
Comment savoir laquelle est la vôtre
Affichez le conteneur, pas le champ, juste au-dessus de la ligne fautive :
print(json.encode(Config.Something))
Si cela affiche null, le problème est le conteneur et le champ est une fausse piste. Si le nom entre parenthèses est un global du framework, ajoutez une attente et voyez si l'erreur bouge : un problème de timing disparaît, une clé manquante non.
Où regarder
Ouvrez le fichier et la ligne de la pile. Lisez toute l'instruction, pas seulement ce qui précède le point : dans a.b.c.d, n'importe lequel de a, a.b ou a.b.c peut être le nil, et le nom entre parenthèses vous dit lequel.
Comment la corriger
Pour le timing du framework, ne lisez jamais l'objet au niveau du fichier :
local PlayerData = {}
RegisterNetEvent('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
end)
-- quand vous en avez vraiment besoin au démarrage :
CreateThread(function()
while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
-- sûr à partir d'ici
end)Pour tout le reste, protégez avant d'indexer :
local entry = Config.Jobs[job] if not entry then return end
Toujours bloqué sur votre propre code ?
Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.
bug_reportOuvrir le Server FixerPour ce type d'erreur, le Script Optimizer lit le script et répare le code derrière tout ça.
Les erreurs qui voyagent avec celle-ci
- tentative d'appeler une valeur nil
- PlayerData est vide ou pas encore chargé
- L'objet du framework est nil (ESX / QBCore)
- impossible de reprendre une coroutine morte
- SCRIPT ERROR dans citizen:/scripting/lua/scheduler.lua
- tentative d'indexer un nombre, un booléen ou du texte
- tentative de yield à travers une frontière d'appel C
- débordement de pile
- l'index de la table est nil