Versuche, einen nil-Wert aufzurufen (Feld, Global, Methode): Wie man es behebt

Bekommst du 'attempt to call a nil value' in FiveM? Was die Varianten Feld, Global und Methode bedeuten, und wie man einen Tippfehler, einen fehlenden Export oder einen Doppelpunkt-gegen-Punkt-Fehler behebt.

In der Konsole:

text
SCRIPT ERROR: @my_script/server/main.lua:42: attempt to call a nil value (field 'GetPlayerFromId')
SCRIPT ERROR: @my_script/client/main.lua:17: attempt to call a nil value (global 'DrawText3D')
SCRIPT ERROR: @my_script/client/main.lua:63: attempt to call a nil value (method 'Notify')

Lua teilt dir mit, dass eine Zeile versuchte, eine Funktion auszuführen, die nicht existiert. Dieser Artikel erklärt die drei Varianten, die üblichen Ursachen und wie man jede behebt.

Was der Fehler bedeutet

In Lua ist ein fehlender Name nicht selbst ein Fehler: Das Lesen gibt nil. Der Fehler erscheint nur, wenn du Klammern danach setzt, weil du nil nicht ausführen kannst. Der Text in Klammern sagt, wie das Skript die fehlende Funktion erreichte:

  • attempt to call a nil value (global 'X'): ein bloßer Aufruf wie X(). Die Funktion wird nicht überall definiert, das das Skript sehen kann.
  • attempt to call a nil value (field 'X'): ein Aufruf durch eine Tabelle wie ESX.X() oder QBCore.Functions.X(). Die Tabelle existiert, aber sie hat keinen Eintrag namens X.
  • attempt to call a nil value (method 'X'): ein Aufruf mit einem Doppelpunkt wie obj:X(). Das Objekt existiert, aber hat keine Methode X.

Die Datei und die Zeile vor der Nachricht (@my_script/server/main.lua:42) ist die Zeile, die den Aufruf macht. Wenn du nicht sicher bist, wie man den Rest der Ausgabe liest, sieh wie man einen FiveM-Skript-Fehler liest.

1. Ein Tippfehler im Namen

Lua unterscheidet Groß- und Kleinschreibung. GetPlayerFromId und getPlayerFromId sind zwei verschiedene Namen, ebenso wie TriggerClientEvent und TriggerclientEvent. Vergleiche den Namen in dem Fehler mit der Framework-Dokumentation, Buchstabe für Buchstabe.

2. Die Funktion existiert nicht in deiner Version

Frameworks benennen und entfernen Funktionen um. Dies ist die häufigste Ursache bei Skripten, die für eine andere Version deines Frameworks geschrieben wurden.

lua
-- an old call that may be gone on your version
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.getInventoryItem('bread')

Überprüfe, was dein Framework wirklich bietet. Drucke die Tabelle aus, um ihre Einträge zu sehen:

lua
for name, value in pairs(ESX) do
    print(name, type(value))
end

Wenn die Funktion, die du brauchst, nicht in der Liste ist, stimmen das Skript und das Framework nicht überein. Aktualisiere das Framework, aktualisiere das Skript oder ersetze den Aufruf durch den, den deine Version hat.

3. Der Export fehlt

Exports sind Funktionen, die eine andere Ressource bereitstellt. Wenn die Ressource gestoppt ist, nicht gestartet wurde oder diesen Namen nicht exportiert, schlägt der Aufruf fehl.

lua
local core = exports['qb-core']:GetCoreObject()
core.Functions.GetPlayer(source)

Wenn die Ressource nicht läuft, druckt FiveM stattdessen No such export. Wenn sie läuft, aber der Export-Name ist falsch, kannst du ein nil-Feld enden. Starte die Ressource zuerst in server.cfg und überprüfe die genauen Export-Namen in seiner Dokumentation oder fxmanifest.lua. Zwei verwandte Fixes: ESX is nil und No such export getSharedObject.

4. Doppelpunkt versus Punkt

Ein Doppelpunkt gibt das Objekt als verborgenes erstes Argument. Ein Punkt tut das nicht. Sie zu mischen gibt entweder diesen Fehler oder falsche Argumente.

lua
-- calls the method with the object as first argument
player:Notify('hello')

-- calls a plain function stored in a table
Utils.Notify('hello')

Wenn der Fehler sagt (method 'Notify'), hat das Objekt keinen Notify-Eintrag: Verwende die Punkt-Form, wenn die Funktion auf der Bibliotheks-Tabelle lebt, oder überprüfe, dass das Objekt wirklich das Ding ist, das du denkst, das es ist. Mit ox_lib, zum Beispiel, ist lib.notify({...}) ein Punkt-Aufruf auf der lib-Tabelle.

5. Die Funktion wird später oder in einer anderen Datei definiert

Eine lokale Funktion muss vor der Zeile definiert werden, die sie aufruft, in der gleichen Datei. Eine Funktion, die in einer anderen Datei definiert ist, ist nur sichtbar, wenn sie global ist, und nur wenn diese Datei durch die gleiche Seite (Client oder Server) der gleichen Ressource geladen ist.

lua
-- fails: DoThing is defined below the call
DoThing()

local function DoThing()
    print('hi')
end

Verschiebe die Definition über den Aufruf, oder deklariere es zuerst mit local DoThing und weise es später zu. Überprüfe auch fxmanifest.lua: Eine Datei, die nicht in client_scripts, server_scripts oder shared_scripts aufgelistet ist, lädt nie, daher existieren ihre Funktionen nie.

lua
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }
shared_scripts { '@ox_lib/init.lua', 'config.lua' }

6. Eine Client-Funktion auf dem Server verwendet, oder umgekehrt

Viele Natives und Framework-Funktionen existieren nur auf einer Seite. PlayerPedId ist nur Client, und GetPlayerIdentifiers ist nur Server. Framework-Tabellen unterscheiden sich auch: ESX.GetPlayerFromId ist eine Server-Funktion, während der Client ESX.GetPlayerData verwendet. Ein Skript, das in shared_scripts läuft, läuft auf beiden Seiten, daher stürzt ein Aufruf, der auf einer Seite funktioniert, auf der anderen ab.

Tipp: Der schnellste Test ist ein Print direkt vor der fehlgeschlagenen Zeile: print(type(ESX.GetPlayerFromId)). Wenn es nil druckt, fehlt die Funktion. Wenn es function druckt, ist das echte Problem anderswo.

Bewache es, während du debuggst

Überprüfe vor dem Aufruf, damit du eine klare Nachricht statt eines Absturzes bekommst:

lua
local fn = ESX.GetPlayerFromId
if type(fn) ~= 'function' then
    print('GetPlayerFromId is missing: check the ESX version')
    return
end

Lasse keine Wachen wie diesen Ort als die Behebung. Sie verstecken das echte Problem, das ein Skript und ein Framework sind, die nicht passen.

Checkliste

Symptom Behebung
(global 'X') Die Funktion wird nicht in der Datei definiert oder wurde nie geladen: überprüfe das Manifest und die Definitions-Reihenfolge
(field 'X') Die Tabelle hat keinen solchen Eintrag: überprüfe die Rechtschreibung und die Framework-Version
(method 'X') Falsches Objekt oder Doppelpunkt verwendet anstelle eines Punkts: überprüfe, was die Variable hält
Funktioniert nur auf einer Seite Die Funktion existiert nur auf Client oder nur auf Server
Fehler nach einem Framework-Update Ersetze die entfernte Funktion durch die neue oder aktualisiere das Skript
Export-Aufruf gibt nil zurück Starte die bereitstellende Ressource zuerst und überprüfe den Export-Namen

Kurze Antworten

Was bedeutet 'attempt to call a nil value'?

Das Skript versuchte, etwas als Funktion auszuführen, aber der Name hält nil, daher ist nichts zum Ausführen da. Der Name in den Klammern sagt dir, welche Funktion fehlt.

Was ist der Unterschied zwischen Feld, Global und Methode in diesem Fehler?

Ein Global ist ein bloßer Name wie Foo(), ein Feld ist ein Tabelleneintrag wie Config.Foo() oder ESX.Foo(), und eine Methode ist ein Aufruf mit einem Doppelpunkt wie obj:Foo(). Es sagt dir nur, wie die fehlende Funktion erreicht wurde.

Kann eine falsche Framework-Version es verursachen?

Ja. Ein Skript, das für eine ältere oder neuere ESX, QBCore oder QBox geschrieben wurde, kann eine Funktion aufrufen, die deine Version umbenannt oder entfernt hat, was nil zurücklässt.

Scripts ohne dieses Problem

Advanced BoostingFahrzeug-Boosting per Tablet: Aufträge von Klasse D bis S+, Crews und eine Live-Warteschlange.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