attempt to index a nil value
Skrypt oczekiwał, że jakaś informacja będzie gotowa, a jej jeszcze nie było, więc się zatrzymał.
Zrób najpierw to
Zanotuj, który skrypt i plik wymienia komunikat, a potem sprawdź, czy nie wystartował przed twoim frameworkiem.
Co to znaczy
Coś użyło operatora . albo [] na zmiennej, która jest nil. W Lua a.b jest legalne tylko wtedy, gdy a jest tablicą; kiedy a jest nil, skrypt zatrzymuje się na tej linii. Komunikat zwykle nazywa to, co było nil: (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').
Ta nazwa w nawiasie to najbardziej przydatna część komunikatu, a każdy jej rodzaj wskazuje gdzie indziej:
• global 'X' — nigdy nieprzypisana albo przypisana w pliku, który się nie wykonał.
• field 'X' — tablica istnieje, ale nie ma takiego klucza.
• local 'X' / upvalue 'X' — przypisana w tym pliku, ale nie przed wykonaniem tej linii.
Co to powoduje
Uszeregowane według tego, jak często są odpowiedzią.
- 1
Obiekt frameworka jeszcze się nie wczytał (najczęstsze po stronie klienta)
Plik kliencki czyta
ESX,QBCorealboPlayerDataw zasięgu pliku albo we wczesnym wątku, zanim framework przekazał obiekt gracza. Twój zasób startuje, zanim framework skończy wczytywać gracza. - 2
Klucz konfiguracji, który nie istnieje
Config.Something.value, gdzieConfig.Somethingnigdy nie zostało zdefiniowane, zmieniło nazwę albo leży w pliku, którego nie ma w fxmanifeście. - 3
Serwer wysłał nil
Handler zdarzenia klienckiego indeksuje tablicę przekazaną przez serwer, a na którejś ścieżce serwer nie przekazał nic.
TriggerClientEvent('x', src)bez danych daje handlerowi nil. - 4
Opakowanie nic nie zwróciło
Funkcje natywne nie zwracają tablic, ale pomocnik wokół jednej z nich może zwrócić nil dla niepoprawnej encji, a wołający to indeksuje.
- 5
Kolejność ładowania
Plik definiujący tablicę jest w fxmanifeście wymieniony PO pliku, który jej używa, więc w momencie użycia jeszcze jej nie ma.
Jak poznać, który jest twój
Wypisz kontener, nie pole, bezpośrednio nad wadliwą linią:
print(json.encode(Config.Something))
Jeśli wypisze null, problemem jest kontener, a pole to fałszywy trop. Jeśli nazwa w nawiasie to globalna frameworka, dodaj czekanie i zobacz, czy błąd się przesunie: problem z czasem znika, brakujący klucz nie.
Gdzie szukać
Otwórz plik i linię ze stosu. Przeczytaj całą instrukcję, nie tylko część przed kropką: w a.b.c.d nilem może być którekolwiek z a, a.b albo a.b.c, a nazwa w nawiasie mówi, które.
Jak to naprawić
Przy problemach z czasem we frameworku nigdy nie czytaj obiektu w zasięgu pliku:
local PlayerData = {}
RegisterNetEvent('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
end)
-- kiedy naprawdę potrzebujesz go przy starcie:
CreateThread(function()
while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
-- od tego miejsca bezpiecznie
end)W pozostałych przypadkach zabezpiecz się przed indeksowaniem:
local entry = Config.Jobs[job] if not entry then return end
Wciąż utknąłeś na własnym kodzie?
Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.
bug_reportOtwórz Server FixerDla tego rodzaju błędu Script Optimizer czyta skrypt i naprawia kod stojący za tym.
Błędy, które chodzą z tym w parze
- attempt to call a nil value
- PlayerData jest puste albo jeszcze niewczytane
- Obiekt frameworka jest nil (ESX / QBCore)
- cannot resume dead coroutine
- SCRIPT ERROR w citizen:/scripting/lua/scheduler.lua
- attempt to index a number, boolean or string value
- attempt to yield across a C-call boundary
- stack overflow
- table index is nil