mauvais argument #1 à 'X' (nombre attendu, got nil) : correction FiveM Lua
Obtenir « bad argument #1 to X (number expected, got nil) » dans FiveM ? Comment lire le numéro d'argument et corriger les entités nil, pairs(nil), tonumber et les erreurs de table.
Quelque part dans votre console, un script s'arrête avec ceci :
SCRIPT ERROR: @my_script/client/main.lua:57: bad argument #1 to 'floor' (number expected, got nil)Une fonction a été appelée avec un argument qu'elle ne peut pas utiliser, et l'argument est presque toujours nil. Le message vous dit quelle fonction, quel argument et quel type elle voulait. Ce guide montre comment le lire et les sources habituelles du nil.
Comment lire le message
bad argument #1 to 'X' (number expected, got nil)Xest le nom de la fonction qui s'est plainte.#1est la position de l'argument :#1est le premier,#2le second.number expectedest le type dont la fonction a besoin. Il peut aussi direstring,tableouboolean.got nilest ce qu'elle a réellement reçu. Il peut aussi êtregot table,got stringougot no value.
Ouvrez la ligne de l'erreur et recherchez la fonction nommée dans le message. Ensuite, regardez l'argument dans cette position et demandez-vous d'où il vient.
local price = Config.Prices[item]
local rounded = math.floor(price) -- bad argument #1 to 'floor' (number expected, got nil)Ici Config.Prices[item] est nil, car item n'est pas une clé de la table. L'erreur est sur la ligne math.floor, mais la faute est dans les données.
table expected, got nil
Le même message avec une table apparaît avec les fonctions table :
bad argument #1 to 'insert' (table expected, got nil)local list
table.insert(list, 'a') -- list was never createdCréez la table avant de l'utiliser :
local list = {}
table.insert(list, 'a')Pour une table qui vit dans une structure partagée, créez-la quand elle manque :
players[source] = players[source] or {}
table.insert(players[source], item)Bouclage sur nil : pairs et ipairs
En Lua 5.3 et 5.4, que FiveM utilise, bouclage sur nil échoue avec un message qui nomme la boucle au lieu de pairs :
bad argument #1 to 'for iterator' (table expected, got nil)for _, job in pairs(Config.Jobs) do -- Config.Jobs is nilVérifiez où la table est définie : une faute de frappe dans le nom, le fichier config pas chargé par le manifest, ou les données qui ne sont pas encore arrivées. Un court garde évite le crash pendant que vous trouvez la vraie cause :
for _, job in pairs(Config.Jobs or {}) doUtilisez-le comme filet de sécurité, pas comme correctif. Si Config.Jobs devrait exister, une boucle vide cache seulement le bug. Le message connexe table index is nil couvre les clés manquantes dans les tables config imbriquées.
Natives qui reçoivent nil
De nombreux natives ont besoin d'un nombre, comme une poignée d'entité. Une poignée qui est nil ou 0 signifie généralement que l'entité n'existe pas (encore).
local vehicle = GetVehiclePedIsIn(ped, false)
local plate = GetVehicleNumberPlateText(vehicle) -- vehicle is 0 when the ped is on footSources communes :
- L'entité n'a pas été chargée. Un véhicule générée par le serveur n'est pas disponible à votre client pendant un moment. Sur le client, attendez jusqu'à ce qu'il existe :
local vehicle = NetToVeh(netId)
local timeout = 0
while not DoesEntityExist(vehicle) and timeout < 100 do
Wait(50)
vehicle = NetToVeh(netId)
timeout = timeout + 1
end- Une fonction n'a rien retourné.
GetPlayerPed(-1),GetClosestVehicleet similaire peut retourner0quand rien ne correspond. Vérifiez la valeur avant de l'utiliser. - Un vecteur faux. Un native qui veut trois nombres,
x, y, z, n'accepte pas une table entière. Passezcoords.x, coords.y, coords.z, ou utilisez unvector3où le native en prend un. - Une clé manquante dans la config.
Config.Spawn.xest nil quandConfig.Spawnest écrit avec[1],[2],[3].
Le texte exact dépend du native, et certains natives ne lèvent pas d'erreur du tout mais ne font rien. C'est pourquoi ajouter une garde vaut le coup :
if vehicle ~= 0 and DoesEntityExist(vehicle) then
SetVehicleEngineOn(vehicle, true, true, false)
endtostring, tonumber et string.format
Les fonctions de conversion sont une autre source de nil :
tonumber('abc')retournenil, pas une erreur, de sorte que le crash vient plus tard quand vous utilisez le résultat.tostring(value)retourne toujours une chaîne, même pournil(cela donne'nil'), donc c'est sûr à utiliser quand vous construisez un texte.string.format('%d', value)échoue quandvalueestnil:bad argument #2 to 'format' (number expected, got nil).
Quand un nombre vient d'un joueur ou d'une commande, vérifiez-le :
RegisterCommand('pay', function(source, args)
local amount = tonumber(args[1])
if not amount then
return print('Usage: /pay [amount]')
end
print(('Paying %d'):format(amount))
end)Notez que args[1] est nil quand le joueur a tapé /pay seul, et tonumber(nil) retourne nil, donc la vérification ci-dessus couvre les deux cas.
Trouvez le nil
Quand la source n'est pas évidente, imprimez les valeurs juste avant la ligne défaillante :
print('item', item, type(item))
print('price', Config.Prices[item], type(Config.Prices[item]))Ensuite, tracez le nil jusqu'à où il devrait avoir été défini. Supprimez les impressions quand vous avez terminé.
Liste de contrôle
| Symptôme | Correction |
|---|---|
bad argument #1 to 'floor' (number expected, got nil) |
La valeur manque : vérifiez la clé ou la variable qui la nourrit |
bad argument #1 to 'insert' (table expected, got nil) |
Créez d'abord la table : t = t or {} |
bad argument #1 to 'for iterator' (table expected, got nil) |
La table sur laquelle vous bouclez est nil ; vérifiez son nom et où elle est remplie |
| Un native échoue sur une entité | Vérifiez DoesEntityExist(entity) et attendez que l'entité se charge |
tonumber(...) donne nil |
Validez l'entrée du joueur avant de l'utiliser |
bad argument #2 to 'format' |
%d et %s ont besoin d'une valeur réelle ; vérifiez l'argument dans cette position |
Si l'erreur concerne quelque chose d'autre que nil au lieu d'un mauvais argument, lisez tentative de comparer nil et tentative d'appel d'une valeur nil.
Réponses rapides
Que signifie « bad argument #1 to X (number expected, got nil) » ?
Une fonction a reçu nil comme premier argument où elle a besoin d'un nombre. X est la fonction, #1 est la position de l'argument, et nil est ce que votre code a passé.
Comment corriger « bad argument #1 to for iterator (table expected, got nil) » ?
Vous avez bouclé sur une variable qui est nil avec pairs ou ipairs. Trouvez où cette variable est remplie et vérifiez qu'elle existe, ou bouclez sur variable or {}.
Un native peut-il recevoir nil sans erreur ?
Selon le native, une valeur nil ou invalide peut être traitée comme 0 ou simplement ne rien faire, de sorte que le bug peut se cacher. Vérifiez une entité avec DoesEntityExist(entity) avant de l'utiliser.
Des scripts sans ce problème
Advanced BoostingDu boosting de véhicules piloté par tablette : contrats de classe D à S+, crews et file d’attente en direct.Voir le script →
CCTV Security CamerasDes caméras à placer, une tablette multi-vues en direct et des photos imprimées comme preuves.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 →