Tabelleneintrag ist nil / Index ein nil-Wert (Feld): FiveM Lua Behebung

Behebe 'table index is nil' und 'attempt to index a nil value (field x)' in FiveM Lua: fehlende Config-Schlüssel, t[nil] Zuweisungen, verschachtelte Tabellen und sichere Zugriffsmuster.

Zwei Fehler, die ähnlich aussehen, kommen ständig in FiveM-Skripten vor:

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')

Sie bedeuten verschiedene Dinge. Der erste handelt von einem nil Schlüssel, der zweite über eine nil Tabelle. Beide kommen darauf an, dass ein Wert, den dein Code erwartete, nicht gefunden wurde. Dieser Leitfaden zeigt, wie man sie auseinanderhält und wie man den Zugriff schreibt, damit er nicht crashen kann.

Tabelleneintrag ist nil

Du hast einer Tabelle zugewiesen, und der Schlüssel war nil:

lua
local cache = {}

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

Lua erlaubt jeden Wert als Schlüssel außer nil (und NaN). Das Lesen von cache[nil] gibt einfach nil, aber Schreiben dazu hebt den Fehler auf.

Finde, welche Variable zwischen den Klammern nil auf dieser Zeile ist. Die üblichen Quellen:

  • Ein Spieler-Lookup, der nichts zurückgab. GetPlayerIdentifierByType(source, 'license') gibt nil zurück, wenn der Spieler keinen Identifier dieses Typs hat, zum Beispiel wenn der Spieler sich nicht über die Plattform verbindet, die du erwartest.
  • Ein falscher source. Auf dem Server überprüfe, dass das Event wirklich von einem Spieler kommt. Ein Aufruf aus der Konsole hat keinen Spieler dahinter.
  • Ein fehlendes Feld in den Daten: data.id ist nil, weil der Sender data.Id verwendet.

Drucke es, um sicher zu sein:

lua
print('identifier', identifier, type(identifier))

Dann stoppa die Zuweisung, wenn der Schlüssel fehlt, und entscheide, ob das ein Fehler oder ein normaler Fall ist:

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

Versuche, einen nil-Wert zu indexieren (Feld 'x')

text
attempt to index a nil value (field 'shops')

Hier fehlt die Tabelle. Der Name in Klammern ist das Feld, das nil war, und das Ding, das du indexierst, ist auf der Zeile:

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

Lua benennt, was es weiß. Ein Paar Formen, die du sehen wirst:

Meldung Bedeutung
(global 'Config') Die globale Variable Config ist nil
(local 'data') Eine lokale Variable ist nil, oft ein Funktions-Argument
(field 'shops') Config.shops ist nil
(field '?') Eine Tabelle, die von einem Variablen-Schlüssel gefunden wird, wie Config.Shops[id], ist nil
(upvalue 'cache') Eine Variable aus einem äußeren Bereich ist nil

Für field '?' kann Lua den Schlüssel nicht benennen, weil er berechnet ist:

lua
Config.Shops[id].label          -- attempt to index a nil value (field '?')

Die Behebung ist die gleiche: Finde, welcher Schritt der Kette nil ist. Drucke jeden Schritt:

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

Verschachtelte Config-Tabellen

Die meisten dieser Fehler kommen von Config-Dateien:

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

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

Wenn shopName 'Bar' anstelle von 'bar' ist, ist Config.Shops[shopName] nil und der nächste .items crasht. Ursachen zu überprüfen:

  1. Unterschiedliche Schreibweise oder Großschreibung. Lua-Schlüssel sind case-sensitiv.
  2. Die Config-Datei wird nicht geladen. Sie muss in shared_scripts (oder die richtige Liste) von fxmanifest.lua sein, bevor die Datei, die sie liest.
  3. Die Config wird nur auf einer Seite definiert. Eine Datei, die unter server_scripts aufgelistet ist, ist für den Client unsichtbar.
  4. Ein numerischer Schlüssel gegen einen String-Schlüssel. Config.Shops[1] und Config.Shops['1'] sind verschiedene Einträge. Das passiert oft, nachdem Daten durch JSON gehen, siehe FiveM json.decode errors.
lua
-- fxmanifest.lua
shared_scripts { 'config.lua' }
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }

Sichere Zugriffsmuster

Wenn ein fehlender Wert ein normaler Fall ist, schreibe den Zugriff so, dass er ihn bearbeitet.

Überprüfe jeden Schritt mit 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)

Verwende or für eine Voreinstellung:

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

Mache einen kleinen Helfer, wenn du tiefe Pfade oft liest:

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')

Achtung: Verstecke nicht jeden nil mit or {}. Wenn eine Tabelle, die existieren muss, fehlt, ist das ein Bug in der Config oder der Load-Reihenfolge, und ein quiet Fallback bewegt den Fehler nur an eine weniger offensichtliche Stelle. Verwende Bewachungen für Werte, die legitim abwesend sein können.

Dump eine Tabelle, um zu sehen, was darin ist

Wenn du nicht sicher bist, was eine Tabelle hält, drucke sie als JSON:

lua
print(json.encode(Config.Shops, { indent = true }))

Du wirst die echten Schlüssel sehen und einen Tippfehler, eine andere Großschreibung oder eine Zahl, wo du einen String erwartest, entdecken. Mache es an dem Punkt, wo der Fehler passiert, nicht am Anfang der Datei, weil die Daten später gefüllt sein können.

Checkliste

Symptom Behebung
table index is nil Der Schlüssel in t[key] = value ist nil; drucke ihn und kehre früh zurück, wenn er fehlt
attempt to index a nil value (field 'shops') Das benannte Feld ist nicht in der Tabelle davor gesetzt; überprüfe den Namen und die Rechtschreibung
attempt to index a nil value (field '?') Ein Lookup mit einem Variablen-Schlüssel fand nichts; überprüfe den Schlüssel und seine Großschreibung
Funktioniert auf dem Server, nil auf dem Client Die Config ist nicht in shared_scripts
Config-Datei ignoriert Liste sie vor den Dateien, die sie verwenden
Numerischer Schlüssel vs String-Schlüssel [1] und ['1'] unterscheiden sich; konvertiere mit tonumber oder tostring

Für die anderen häufigen nil Meldungen, siehe attempt to compare nil und bad argument errors.

Kurze Antworten

Was bedeutet 'table index is nil'?

Das Skript versuchte, in eine Tabelle mit nil als Schlüssel zu schreiben, wie t[key] = value, wenn key nil ist. Lua erlaubt nil nicht als Schlüssel, daher stoppt es.

Was ist der Unterschied zwischen 'table index is nil' und 'attempt to index a nil value'?

In 'table index is nil' ist der Schlüssel nil. In 'attempt to index a nil value' ist die Tabelle selbst nil, daher gibt es nichts zum Lesen oder Schreiben.

Warum sagt der Fehler Feld '?' anstelle eines Namens?

Wenn der Schlüssel eine Variable ist wie Config.Shops[id], kann Lua ihn nicht benennen. Es zeigt ?. Schaue auf die Zeile und finde, welcher Teil der Kette nil ist.

Scripts ohne dieses Problem

Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →Quest CreatorEin visueller Editor für Quests und NPC-Dialoge, Node für Node im Spiel gebaut.Script ansehen →Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →

Weiterlesen