bad argument #1 to 'X' (number expected, got nil): FiveM Lua Behebung
Bekommst du 'bad argument #1 to X (number expected, got nil)' in FiveM? Wie man die Argument-Nummer liest und nil-Entitäten, pairs(nil), tonumber und Tabellenfehler behebt.
Irgendwo in deiner Konsole stoppt ein Skript mit:
SCRIPT ERROR: @my_script/client/main.lua:57: bad argument #1 to 'floor' (number expected, got nil)Eine Funktion wurde mit einem Argument aufgerufen, das sie nicht verwenden kann, und das Argument ist fast immer nil. Die Meldung sagt dir, welche Funktion, welches Argument und welchen Typ es wollte. Dieser Leitfaden zeigt dir, wie man es liest und die üblichen Quellen des nil.
Wie man die Meldung liest
bad argument #1 to 'X' (number expected, got nil)Xist der Name der Funktion, die sich beschwerte.#1ist die Position des Arguments:#1ist der erste,#2der zweite.number expectedist der Typ, den die Funktion braucht. Es kann auchstring,tableoderbooleansagen.got nilist das, was es tatsächlich erhielt. Es kann auchgot table,got stringodergot no valuesein.
Öffne die Zeile aus dem Fehler und schaue die Funktion an, die in der Meldung benannt ist. Schaue dann auf das Argument an dieser Position und frag dich, woher es kommt.
local price = Config.Prices[item]
local rounded = math.floor(price) -- bad argument #1 to 'floor' (number expected, got nil)Hier ist Config.Prices[item] nil, weil item kein Schlüssel der Tabelle ist. Der Fehler ist auf der math.floor-Zeile, aber der Fehler ist in den Daten.
Tabelle erwartet, nil erhalten
Die gleiche Meldung mit einer Tabelle erscheint mit table-Funktionen:
bad argument #1 to 'insert' (table expected, got nil)local list
table.insert(list, 'a') -- list was never createdErstelle die Tabelle, bevor du sie verwendest:
local list = {}
table.insert(list, 'a')Für eine Tabelle, die in einer gemeinsamen Struktur lebt, erstelle sie, wenn sie fehlt:
players[source] = players[source] or {}
table.insert(players[source], item)Schleifen über nil: pairs und ipairs
In Lua 5.3 und 5.4, das FiveM verwendet, schlägt das Schleifen über nil mit einer Meldung fehl, die die Schleife benennt anstelle von pairs:
bad argument #1 to 'for iterator' (table expected, got nil)for _, job in pairs(Config.Jobs) do -- Config.Jobs is nilÜberprüfe, wo die Tabelle definiert wird: ein Tippfehler im Namen, die Config-Datei nicht vom Manifest geladen, oder Daten, die noch nicht angekommen sind. Eine kurze Bewachung vermeidet den Crash, während du die echte Ursache findest:
for _, job in pairs(Config.Jobs or {}) doVerwende es als Sicherheitsnetz, nicht als Behebung. Wenn Config.Jobs existieren sollte, hides eine leere Schleife nur den Bug. Die verwandte Meldung table index is nil behandelt fehlende Schlüssel in verschachtelten Config-Tabellen.
Natives, die nil erhalten
Viele Natives brauchen eine Zahl, wie ein Entity-Handle. Ein Handle, das nil oder 0 ist, bedeutet normalerweise, dass die Entität noch nicht existiert (noch).
local vehicle = GetVehiclePedIsIn(ped, false)
local plate = GetVehicleNumberPlateText(vehicle) -- vehicle is 0 when the ped is on footHäufige Quellen:
- Die Entität ist nicht geladen. Ein Fahrzeug, das von dem Server gespawnt wird, ist für einen Moment für deinen Client nicht verfügbar. Auf dem Client, warte bis es existiert:
local vehicle = NetToVeh(netId)
local timeout = 0
while not DoesEntityExist(vehicle) and timeout < 100 do
Wait(50)
vehicle = NetToVeh(netId)
timeout = timeout + 1
end- Eine Funktion gab nichts zurück.
GetPlayerPed(-1),GetClosestVehicleund ähnliche können0zurückgeben, wenn nichts passt. Überprüfe den Wert, bevor du ihn verwendest. - Ein falscher Vektor. Ein Native, das drei Zahlen will,
x, y, z, akzeptiert keine ganze Tabelle. Übergibcoords.x, coords.y, coords.z, oder verwende einvector3, wo das Native einen nimmt. - Ein fehlender Schlüssel in der Config.
Config.Spawn.xist nil, wennConfig.Spawnmit[1],[2],[3]geschrieben wird.
Der genaue Text hängt vom Native ab, und einige Natives erheben überhaupt keinen Fehler, aber tun nichts. Deshalb lohnt sich eine Bewachung:
if vehicle ~= 0 and DoesEntityExist(vehicle) then
SetVehicleEngineOn(vehicle, true, true, false)
endtostring, tonumber und string.format
Konvertierungsfunktionen sind eine weitere Quelle des nil:
tonumber('abc')gibtnilzurück, nicht einen Fehler, daher kommt der Crash später, wenn du das Ergebnis verwendest.tostring(value)gibt immer einen String zurück, auch fürnil(es gibt'nil'), daher ist es sicher zu verwenden, wenn du einen Text buildest.string.format('%d', value)schlägt fehl, wennvaluenilist:bad argument #2 to 'format' (number expected, got nil).
Wenn eine Zahl von einem Spieler oder von einem Befehl kommt, überprüfe sie:
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)Beachte args[1] ist nil, wenn der Spieler /pay allein tippte, und tonumber(nil) gibt nil zurück, daher deckt die Überprüfung oben beide Fälle ab.
Finde das nil
Wenn die Quelle nicht offensichtlich ist, drucke die Werte direkt vor der fehlgeschlagenen Zeile:
print('item', item, type(item))
print('price', Config.Prices[item], type(Config.Prices[item]))Dann verfolge das nil zurück bis dort, wo es hätte gesetzt werden sollen. Entferne die Prints, wenn du fertig bist.
Checkliste
| Symptom | Behebung |
|---|---|
bad argument #1 to 'floor' (number expected, got nil) |
Der Wert fehlt: überprüfe den Schlüssel oder die Variable, die ihn speist |
bad argument #1 to 'insert' (table expected, got nil) |
Erstelle die Tabelle zuerst: t = t or {} |
bad argument #1 to 'for iterator' (table expected, got nil) |
Die Tabelle, über die du schleifst, ist nil; überprüfe ihren Namen und wo sie gefüllt wird |
| Ein Native schlägt auf einer Entität fehl | Überprüfe DoesEntityExist(entity) und warte, dass die Entität lädt |
tonumber(...) gibt nil |
Validiere die Spieler-Eingabe vor der Verwendung |
bad argument #2 to 'format' |
%d und %s brauchen einen echten Wert; überprüfe das Argument an dieser Position |
Wenn der Fehler von etwas ist, das nil ist anstelle eines schlechten Arguments, lies attempt to compare nil und attempt to call a nil value.
Kurze Antworten
Was bedeutet 'bad argument #1 to X (number expected, got nil)'?
Eine Funktion erhielt nil als sein erstes Argument, wo es eine Zahl braucht. X ist die Funktion, #1 ist die Position des Arguments, und nil ist das, das dein Code übergab.
Wie behebt man 'bad argument #1 to for iterator (table expected, got nil)'?
Du schleifst über eine Variable, die nil ist, mit pairs oder ipairs. Finde heraus, wo diese Variable gefüllt wird und überprüfe, dass sie existiert, oder schleife über variable or {}.
Kann ein Native nil ohne einen Fehler erhalten?
Je nach dem Native kann ein nil- oder ungültiger Wert als 0 behandelt werden oder einfach nichts tun, daher kann der Bug sich verstecken. Überprüfe eine Entität mit DoesEntityExist(entity), bevor du sie verwendest.
Scripts ohne dieses Problem
Advanced BoostingFahrzeug-Boosting per Tablet: Aufträge von Klasse D bis S+, Crews und eine Live-Warteschlange.Script ansehen →
CCTV Security CamerasPlatzierbare Kameras, ein Live-Tablet mit Multi-View und ausgedruckte Beweisfotos.Script ansehen →
Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →