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:

text
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

text
bad argument #1 to 'X' (number expected, got nil)
  • X ist der Name der Funktion, die sich beschwerte.
  • #1 ist die Position des Arguments: #1 ist der erste, #2 der zweite.
  • number expected ist der Typ, den die Funktion braucht. Es kann auch string, table oder boolean sagen.
  • got nil ist das, was es tatsächlich erhielt. Es kann auch got table, got string oder got no value sein.

Ö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.

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

text
bad argument #1 to 'insert' (table expected, got nil)
lua
local list
table.insert(list, 'a')     -- list was never created

Erstelle die Tabelle, bevor du sie verwendest:

lua
local list = {}
table.insert(list, 'a')

Für eine Tabelle, die in einer gemeinsamen Struktur lebt, erstelle sie, wenn sie fehlt:

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

text
bad argument #1 to 'for iterator' (table expected, got nil)
lua
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:

lua
for _, job in pairs(Config.Jobs or {}) do

Verwende 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).

lua
local vehicle = GetVehiclePedIsIn(ped, false)
local plate = GetVehicleNumberPlateText(vehicle)   -- vehicle is 0 when the ped is on foot

Hä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:
lua
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), GetClosestVehicle und ähnliche können 0 zurü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. Übergib coords.x, coords.y, coords.z, oder verwende ein vector3, wo das Native einen nimmt.
  • Ein fehlender Schlüssel in der Config. Config.Spawn.x ist nil, wenn Config.Spawn mit [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:

lua
if vehicle ~= 0 and DoesEntityExist(vehicle) then
    SetVehicleEngineOn(vehicle, true, true, false)
end

tostring, tonumber und string.format

Konvertierungsfunktionen sind eine weitere Quelle des nil:

  • tonumber('abc') gibt nil zurü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ür nil (es gibt 'nil'), daher ist es sicher zu verwenden, wenn du einen Text buildest.
  • string.format('%d', value) schlägt fehl, wenn value nil ist: bad argument #2 to 'format' (number expected, got nil).

Wenn eine Zahl von einem Spieler oder von einem Befehl kommt, überprüfe sie:

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

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

Weiterlesen