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:
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 wieX(). Die Funktion wird nicht überall definiert, das das Skript sehen kann.attempt to call a nil value (field 'X'): ein Aufruf durch eine Tabelle wieESX.X()oderQBCore.Functions.X(). Die Tabelle existiert, aber sie hat keinen Eintrag namensX.attempt to call a nil value (method 'X'): ein Aufruf mit einem Doppelpunkt wieobj:X(). Das Objekt existiert, aber hat keine MethodeX.
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.
-- 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:
for name, value in pairs(ESX) do
print(name, type(value))
endWenn 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.
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.
-- 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.
-- fails: DoThing is defined below the call
DoThing()
local function DoThing()
print('hi')
endVerschiebe 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.
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 esnildruckt, fehlt die Funktion. Wenn esfunctiondruckt, 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:
local fn = ESX.GetPlayerFromId
if type(fn) ~= 'function' then
print('GetPlayerFromId is missing: check the ESX version')
return
endLasse 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 →