THE ORB
Studio wird gestartet

Versuch, einen nil-Wert zu indizieren

Ein Script erwartete, dass eine Information bereit ist, und sie war es nicht — also hat es aufgehört.

groupsDiese Funktion hört auf zu funktionierencodeBraucht einen Entwickler

Mach das zuerst

Notier, welches Script und welche Datei die Meldung nennt, und prüf, ob es vor deinem Framework gestartet ist.

bug_reportFüg lieber deine ganze Konsole ein

Was es bedeutet

Etwas hat den Operator . oder [] auf eine Variable angewendet, die nil ist. In Lua ist a.b nur zulässig, wenn a eine Tabelle ist; ist a nil, hält das Script auf dieser Zeile an. Die Meldung nennt meist, was nil war: (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').

Dieser Name in Klammern ist der nützlichste Teil der Meldung, und jede Art zeigt woanders hin:

global 'X' — nie zugewiesen oder in einer Datei zugewiesen, die nicht lief.

field 'X' — die Tabelle gibt es, diesen Schlüssel nicht.

local 'X' / upvalue 'X' — in dieser Datei zugewiesen, aber nicht bevor diese Zeile lief.

Was es auslöst

Sortiert danach, wie oft es die Antwort ist.

  1. 1

    Das Framework-Objekt ist noch nicht geladen (am häufigsten auf dem Client)

    Eine Client-Datei liest ESX, QBCore oder PlayerData auf Dateiebene oder in einem frühen Thread, bevor das Framework das Spielerobjekt übergeben hat. Deine Resource startet, bevor das Framework den Spieler fertig geladen hat.

  2. 2

    Ein Konfigurationsschlüssel, den es nicht gibt

    Config.Something.value, wobei Config.Something nie definiert, umbenannt wurde oder in einer Datei liegt, die nicht in der fxmanifest steht.

  3. 3

    Der Server hat nil geschickt

    Ein Client-Event-Handler indiziert eine Tabelle, die der Server übergeben hat — und auf einem Weg hat der Server nichts übergeben. TriggerClientEvent('x', src) ohne Nutzlast gibt dem Handler nil.

  4. 4

    Ein Wrapper, der nichts zurückgab

    Natives geben keine Tabellen zurück, aber ein Helfer um eine herum kann für eine ungültige Entity nil liefern — und der Aufrufer indiziert das.

  5. 5

    Die Ladereihenfolge

    Die Datei, die die Tabelle definiert, steht in der fxmanifest NACH der Datei, die sie nutzt — zum Zeitpunkt der Nutzung gibt es sie noch nicht.

Wie du erkennst, welcher deiner ist

Gib den Container aus, nicht das Feld, direkt über der fehlschlagenden Zeile:

print(json.encode(Config.Something))

Druckt es null, ist der Container das Problem und das Feld eine falsche Fährte. Ist der Name in Klammern ein Framework-Global, füg ein Warten ein und sieh, ob sich der Fehler verschiebt: Ein Timing-Problem verschwindet, ein fehlender Schlüssel nicht.

Wo du nachsehen musst

Öffne Datei und Zeile aus dem Stack. Lies die ganze Anweisung, nicht nur den Teil vor dem Punkt: In a.b.c.d kann jedes von a, a.b oder a.b.c das nil sein, und der Name in Klammern sagt dir, welches.

Wie du es behebst

Beim Framework-Timing: lies das Objekt nie auf Dateiebene:

local PlayerData = {}

RegisterNetEvent('esx:playerLoaded', function(xPlayer)
    PlayerData = xPlayer
end)

-- wenn du es wirklich beim Start brauchst:
CreateThread(function()
    while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
    -- ab hier sicher
end)

Für alles andere: absichern, bevor du indizierst:

local entry = Config.Jobs[job]
if not entry then return end

Hängst du immer noch an deinem eigenen Code?

Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.

bug_reportServer Fixer öffnen

Für diese Art Fehler Script Optimizer liest das Script und repariert den Code dahinter.

Fehler, die mit diesem zusammen auftreten